当前位置:   article > 正文

python赋值、深拷贝和浅拷贝的区别详解_python赋值浅拷贝和深拷贝的区别

python赋值浅拷贝和深拷贝的区别

一、前言

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

二、区别

1、直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变

  1. # 直接赋值
  2. dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
  3. dict_2 = dict_1
  4. dict_1["key1"].append(5)
  5. print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
  6. print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)

  2、浅拷贝,只拷贝父对象,子对象只是引用内存地址(不会拷贝嵌套的对象)

  1. # 浅拷贝
  2. dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
  3. dict_2 = dict_1.copy()
  4. dict_1["key1"].append(5)
  5. print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
  6. print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)

 备注:父对象的内存地址直接被拷贝到了一个新的电脑上,但是对于子对象只是引用了它的内存地址,并没有拷贝子对象里面可迭代的内容。如果子对象里面的内容修改后,被赋值的变量也会做相同的改变

3、深拷贝,父对象,子对象都会拷贝

  1. # 深拷贝代码
  2. dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
  3. # 浅拷贝
  4. dict_2 = dict_1.copy()
  5. # 深拷贝
  6. dict_3 = copy.deepcopy(dict_1)
  7. dict_1["key1"].append(5)
  8. print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
  9. print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)
  10. print("dict_3内存地址:",id(dict_3),id(dict_3["key1"]),dict_3)

 备注:深拷贝的话,就直接将父对象,子对象的内容拷贝到了自己的电脑上。通俗点讲,浅拷贝的话就是藕断丝连,深拷贝的话就是绝交。在使用上,不得不去拷贝对象的时候,尽量使用深拷贝,因为浅拷贝的话,是引用子对象的内存地址。深拷贝的话主要就是用在了有嵌套对象。

接下来的话一张图进行展示:

4、面试题:不可变元组和可变列表深浅拷贝的区别

  1. a_tuple = (1,2)
  2. b = copy.copy(a_tuple)
  3. c = copy.deepcopy(a_tuple)
  4. print(b == c)
  5. print(id(b) == id(c))
  6. print(id(a_tuple))
  7. print(id(b))
  8. print(id(c))
  9. a_list = [3,4]
  10. b = copy.copy(a_list)
  11. c = copy.deepcopy(a_list)
  12. print(b == c)
  13. print(id(b) == id(c))
  14. print(id(a_tuple))
  15. print(id(b))
  16. print(id(c))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/71399
推荐阅读
相关标签
  

闽ICP备14008679号