Python杂学--一文搞懂赋值、浅拷贝、深拷贝

1.赋值(=)

赋值其实就是对对象的直接引用。例子如下:

由下方代码可知:把lz1赋值给lz2,lz1和lz2的地址(id)是相同的,向lz1添加一个元素,lz2的元素同步的也会发生修改。

lz1 = [1,2,3,4]
lz2 = lz1
print(id(lz1))  # 输出:140608361616648
print(id(lz2))  # 输出:140608361616648
lz1.append(5)
print(lz1)  # 输出:[1, 2, 3, 4, 5]
print(lz2)  # 输出:[1, 2, 3, 4, 5]

2.浅拷贝(copy())记得使用前先import下copy

浅拷贝只会拷贝父对象,不会拷贝对象内部的子对象,他们的子对象还是指向统一对象(即引用子对象)

import copy
ls1 = [1,2,3,4]
ls3 = ls1.copy()
print(id(ls1),id(ls3)) # 浅拷贝,ID值不同--》140310230470408 140310230471176
ls1.append(5)
print(ls1,ls3)  # 对ls1进行浅拷贝操作,不会影响ls3的值 --》[1, 2, 3, 4, 5] [1, 2, 3, 4]

# 浅拷贝
ls3 = {'a':[1,2,3,4]}
ls4 = ls3.copy()
ls3['a'].append(5)
# 输出结果可知,字典对象ls3的子对象的值发生改动时,因为浅拷贝不会拷贝对象的内部子对象,
# 他们的子对象还是指向统一的对象,所以ls3的子对象有改动时,ls4也会改动
print(ls3) # {'a': [1, 2, 3, 4, 5]}
print(ls4) # {'a': [1, 2, 3, 4, 5]}

# 注意!!! 修改ls3的子对象指向其他对象,ls4仍指向原对象
ls3['a'] = [6,7]
print(ls3) # {'a': [6, 7]}
print(ls4) # {'a': [1, 2, 3, 4, 5]}

3.深拷贝(copy 模块的 deepcopy 方法)

完全拷贝了父对象及其子对象

# ls3 = {'a': [1, 2, 3, 4, 5]}
ls5 = copy.deepcopy(ls3)
ls3['a'].append(88)
print(ls3,ls5)  # {'a': [1, 2, 3, 4, 5, 88]} {'a': [1, 2, 3, 4, 5]}

-------------------------------------------------------------------------------------

感兴趣的话可以关注下本人公众号哈,大家一起学习~~旁边是刘阿童木的公众号也是干货满满大家关注一波~
Python杂学--一文搞懂赋值、浅拷贝、深拷贝_第1张图片Python杂学--一文搞懂赋值、浅拷贝、深拷贝_第2张图片

你可能感兴趣的:(Python学习,python)