Python 浅拷贝与深拷贝,copy模块

python中的任何变量都是对象(引用类型)。

python中的变量分为可变类型和不可变类型。(浅拷贝和深拷贝都是拷贝可变类型内容,不可变类型不会拷贝)

注意:因为元组是不可变类型,所以元组的浅拷贝并不会拷贝任何内容,而是直接引用源元组(和=赋值等同)。

如果元组中的元素都是不可变类型,那么元组的深拷贝也并不会拷贝任何内容,而是直接引用源元组;但是如果元组中的元素有可变类型,那么深拷贝才会真正的去深拷贝元组以及元组中的可变元素。

列表、字典的切片([0,1,2][:])和浅拷贝相同。字典的copy()函数也是浅拷贝。

注意:因为不可变类型的变量不会改变,所以不会拷贝任何不可变类型的变量,都是直接引用不可变类型。

demo.py(浅拷贝与深拷贝):

import copy  # 导入copy模块


a = [11,22];
b = [33,44];

list_1 = [a,b];

list_2 = list_1;   # 赋值语句。 不会拷贝,只会将list_1的引用给变量list_2
list_3 = copy.copy(list_1);   # 浅拷贝。 只会拷贝最顶层(列表),列表中的元素不会拷贝。
list_4 = copy.deepcopy(list_1);  # 深拷贝。 除了拷贝列表外,列表中的所有可变元素也会拷贝一份。


print(id(list_1))  # 140338425038856
print(id(list_2))  # 140338425038856  赋值语句不会拷贝,和list_1引用一样
print(id(list_3))  # 140338449044936  浅拷贝,只拷贝列表,列表中的元素不拷贝
print(id(list_4))  # 140338425040008  深拷贝,拷贝列表,列表中的可变元素也会拷贝

print(id(list_1[0]))  # 140338425039944
print(id(list_3[0]))  # 140338425039944  浅拷贝,列表中元素的引用与源引用一样
print(id(list_4[0]))  # 140338425039432  深拷贝,列表中可变元素的引用与源引用不一样

# list_1 = "xxxx"    # 修改list_1变量不会影响list_2,list_3和list_4
# list_1.append("xx")  # 修改源列表会影响list_2,不会影响list_3和list_4
# list_1[0].append("xxx")  # 修改源列表中的可变元素会影响list_2,list_3;但不会影响list_4

print(list_1)
print(list_2)
print(list_3)
print(list_4)


猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/84654633