在处理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 。 (这与你的第二个例子稍有不同,因为在这种情况下, foobar不仅相同,而且实际上是指同一个对象。)

链接地址: http://www.djcxy.com/p/79377.html

上一篇: Can't understand python shallow copy when working with int and str

下一篇: Shallow copying a pointer. Why is this code working?