python赋值,浅拷贝和深拷贝

>>> a = 1
>>> b = a
>>> a = 2
>>> a
2
>>> b
1
>>> 

你将 1 赋给 a 变量,然后拷贝 a 中的值,将它赋给变量 b。当稍
后将 a 中的值改变为 2 时,这不会影响 b 中的值。这是因为 ab
是不同的变量,保存了不同的值。

但列表不是这样的。当你将列表赋给一个变量时,实际上是将列表的“引用”
赋给了该变量。引用是一个值,指向某些数据。列表引用是指向一个列表的值。这
里有一些代码,让这个概念更容易理解。在交互式环境中输入以下代码:

>>> list1 = ['a','b','c','d']
>>> list2 = list1
>>> list1[-1] = 'r'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'c', 'r']
#list1中的引用被复制给 list2。只有新的引用被创建并保存在 list2中,而非新的列表。请注意,两个引用都指向同一个列表。

在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了
传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,
Python 提供了名为 copy 的模块,其中包含 copy()和 deepcopy()函数。第一个函数
copy.copy(),可以用来复制列表或字典这样的可变值,而不只是复制引用。在交互
式环境中输入以下代码:

>>> import copy
>>> list1 = ['a','b','c','d']
>>> list2 = copy.copy(list1)
>>> list1[-1] = 'r'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'c', 'd']
>>> list2[2] = 'g'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'g', 'd']
#如果是列表中嵌套列表,当修改内部列表时,原列表和拷贝的列表都发生的变化
>>> import copy
>>> list1 = ['a','b','c','d']
>>> list2 = ['q','w','e',list1]
>>> list3 = copy.copy(list2)
>>> list2[1] = 'M'
>>> list2
['q', 'M', 'e', ['a', 'b', 'c', 'd']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]
>>> list2[-1][-1] = 'R'
>>> list2
['q', 'M', 'e', ['a', 'b', 'c', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'R']]

如果要复制的列表中包含了列表,那就使用 copy.deepcopy()函数来代替

>>> import copy
>>> 
>>> list1 = ['a','b','c','d']
>>> list2 = ['q','w','e',list1]
>>> list3 = copy.deepcopy(list2)
>>> list2[-1][-1] = 'R'
>>> list2
['q', 'w', 'e', ['a', 'b', 'c', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]
>>> list1
['a', 'b', 'c', 'R']
>>> list1[2] = 'F'
>>> list2
['q', 'w', 'e', ['a', 'b', 'F', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]

猜你喜欢

转载自blog.csdn.net/qq_37287621/article/details/84073173
今日推荐