Loading

Python深拷贝和浅拷贝

  • 浅拷贝就是对于一个对象引用的拷贝,而深拷贝就是对对象资源(具体值)的拷贝
  • 对于不可变对象(字符串、元组,整型)的修改,需要开辟新的空间,此时id发生改变,而对于可变对象(列表,字典等)的修改,不需要开辟新的空间
  • 浅拷贝后的orilist和copylist中的元素都指向了相同的地址。修改不可变对象的时候,就需要开辟新的空间(地址变了),所以orilist和copylist中的字符串内容不一样。但是对于list,修改orilist中的list对象后,copylist中的list内容也随之发生了改变。(因为copylist和orlist的list是指向的同一个对象)
  • 深拷贝无论是对于可变对象还是不可变对象,对于orilist的修改都不会影响到deepcopylist中的内容

对于一个可变对象(列表)的例子

注意到 python3 语言, 对象是一个盒子,有具体的地址,而变量名相当于是 "标签",可以贴在盒子上。

我们需要辨析:nums1 = A 和 nums1[:] = A 的不同之处:

  • nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
  • nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
# 对象在内存中的地址与id一一对应,可以使用 id() 查看并判断是否是同一个对象

nums1 = [1,2,4,0,0] 
print(id(nums1)) # 140125129895880

A = [1,2,3,4,5]
print(id(A))     # 140125129856640

nums1[:] = A
print(id(nums1))) # 140125129895880,  仍是原 list 对象, 只不过这一 list 对象的值发生了改变

# 若不执行 nums1[:] = A, 而执行
nums1 = A
print(id(nums1))  # 140125129856640, 不再是之前的那个 list 对象
posted @ 2020-10-25 11:04  MayeZhang  阅读(144)  评论(0编辑  收藏  举报