在处理int和str时无法理解python浅层副本
关于复制的Python文档
浅层和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:
浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中。 深层副本构造一个新的复合对象,然后递归地将副本插入到原始对象中找到的对象。
我认为浅拷贝应该复制列表的引用,因此更新shallow_copy_list也应该更改原始列表,但第一个示例不能按预期工作。
Python 3.6.0(默认,2016年12月24日,08:01:42)[GCC 4.2.1 Compatible Apple LLVM 8.0.0(clang-800.0.42.1)]达尔文
items = [1, 2, 3, 4, 5, 6]
items_copy = items[:]
items_copy[0] = 'a'
items_copy == items
False
我认为这是一个浅拷贝,而items_copy ==项目应该返回True,但它是False。 但是另一个例子返回True
items = [{'id': 1, 'name': 'laptop', 'value': 1000}, {'id': 2, 'name': 'chair', 'value': 300},]
items_copy = items[:]
items_copy[0]['id'] = 'a'
items_copy == items
True
参考文献:
Python浅和深拷贝
Ned Batchelder - 有关Python名称和值的事实和神话 - PyCon 2015
据我所知: 浅拷贝意味着字典的内容not copied by value
,而是创建一个新的引用。
看看这个例子。
items = [{'id': 1, 'name': 'laptop', 'value': 1000}, {'id': 2, 'name': 'chair', 'value': 300},]
items_copy = items[:]
items_copy[0]['id'] = 'a'
print items_copy,id(items_copy),items,id(items)
print items_copy == items
输出:
[{'id': 'a', 'value': 1000, 'name': 'laptop'}, {'id': 2, 'value': 300, 'name': 'chair'}] 4455943200 [{'id': 'a', 'value': 1000, 'name': 'laptop'}, {'id': 2, 'value': 300, 'name': 'chair'}] 4455866312
True
items = [{'id': 1, 'name': 'laptop', 'value': 1000}, {'id': 2, 'name': 'chair', 'value': 300},]
items_copy = items[:]
items_copy[0]= 'a'
print items_copy,id(items_copy),items,id(items)
print items_copy == items
输出:
['a', {'id': 2, 'value': 300, 'name': 'chair'}] 4455943200 [{'id': 'a', 'value': 1000, 'name': 'laptop'}, {'id': 2, 'value': 300, 'name': 'chair'}] 4455866312
False
此代码:
items_copy[0] = 'a'
意味着“替换项items_copy[0]
与a
,它改变由所引用的对象items_copy
(并且因此改变了指代对象,在这种情况下不包括所有其它变量items
),但没有作用在所有对于以前在items_copy[0]
(在此字典中)。
这与这一系列事件类似:
foo = {'id': 1, 'name': 'laptop', 'value': 1000}
bar = foo
foo = 'a'
foo == bar
这将返回False
,因为bar
仍然是(不变的)字典对象。
在第二种情况下,您没有修改任何一个列表,但是您修改了由两个副本引用的(第一个)字典,与此序列相似:
foo = {'id': 1, 'name': 'laptop', 'value': 1000}
bar = foo
foo['id'] = 'a'
foo == bar
这将返回True
。 (这与你的第二个例子稍有不同,因为在这种情况下, foo
和bar
不仅相同,而且实际上是指同一个对象。)
上一篇: Can't understand python shallow copy when working with int and str