意外的deque python行为

时间:2014-12-04 19:34:18

标签: python collections deque

为什么要进行以下任务..

d = deque('abc')
a = d
d.clear()
print a
  
    

双端队列([])

  

返回一个空的双端队列?我希望保留 a 中的数据,尽管清除旧的双端队列。

3 个答案:

答案 0 :(得分:5)

ad引用同一个对象。因此,如果您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

但是您会在ad中获得两个不同的对象,这些对象在使用后会有所不同。

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