[英]Unexpected deque python behaviour
为什么在以下作业..
d = deque('abc')
a = d
d.clear()
print a
双端队列([])
返回一个空的双端队列? 我预计,尽管清除旧的双端队列中保留数据 。
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
得到两个不同的对象,使用它们后会有所不同。
这条线:
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.