为什么要进行以下任务..
d = deque('abc')
a = d
d.clear()
print a
双端队列([])
返回一个空的双端队列?我希望保留 a 中的数据,尽管清除旧的双端队列。
答案 0 :(得分:5)
a
和d
引用同一个对象。因此,如果您clear
它,它将被清除为"两个变量"。
您可以通过打印对象的身份来检查。
>>> id(a)
44988624L
>>> id(d)
44988624L
通过分配复制值只适用于int
等基本数据类型。
如果你处理对象,你必须复制它,因为变量本身只是持有对象的引用。
你可以用
做到这一点d = deque('abc')
a = deque('abc')
或
>>> import copy
>>> d = copy.copy(a)
导致
>>> id(a)
44988624L
>>> id(d)
44989352L
但是您会在a
和d
中获得两个不同的对象,这些对象在使用后会有所不同。
答案 1 :(得分:4)
该行:
a = d
不会创建副本 - 它只是为同一个对象创建另一个名称。
要创建副本,请执行以下操作:
d = deque('abc')
a = deque(d)
答案 2 :(得分:1)
>>> from copy import deepcopy
>>> d = deque('abc')
>>> a = deepcopy(d)
>>> d.clear()
>>> a
deque(['a', 'b', 'c'])
或者您可以使用deque's
内置复制功能。
>>> d = deque('abc')
>>> a = d.__copy__
>>> a
<built-in method __copy__ of collections.deque object at 0x02437C70>
>>> a = d.__copy__()
>>> a
deque(['a', 'b', 'c'])
>>> d.clear()
>>> a
deque(['a', 'b', 'c'])
在清除d
偶数a
后,您正在引用相同的对象。为此,您需要使用deepcopy将object d
复制到a
。哪个为您复制对象而不是引用它
>>> id(a)
37976360
>>> id(d)
37976248