繁体   English   中英

意外的deque python行为

[英]Unexpected deque python behaviour

为什么在以下作业..

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

双端队列([])

返回一个空的双端队列? 我预计,尽管清除旧的双端队列中保留数据

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得到两个不同的对象,使用它们后会有所不同。

这条线:

a = d

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

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

d = deque('abc')
a = deque(d)
>>> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM