意外的deque python行为

4
在下面的赋值语句中,为什么要使用三个等号(===)而不是两个等号(==)?
d = deque('abc')
a = d
d.clear()
print a

deque([])

这会返回一个空的deque(双端队列)吗?尽管清空了旧的deque,但我希望在a中保留数据。

3个回答

8
< p > a 和 d 引用相同的对象。因此,如果您对其进行清除,则"两个变量"都将被清除。

您可以通过打印对象的标识来检查。

>>> 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

但是,如果你这样做,在ad中会得到两个不同的对象,使用后它们将有所不同。


4

这行代码:

a = d

不会创建副本 - 它只是为同一对象创建另一个名称。

要创建副本,请执行以下操作:

d = deque('abc')
a = deque(d)

1
>>> from copy import deepcopy
>>> d = deque('abc')
>>> a = deepcopy(d)
>>> d.clear()
>>> a
deque(['a', 'b', 'c'])

或者您可以使用 deque 的内置 copy 函数。

>>> 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 也被清除了。为此,你需要使用深拷贝将 object d 复制到 a 中。这样可以为你复制对象而不是引用它。
>>> id(a)
37976360
>>> id(d)
37976248

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接