【发布时间】:2015-02-02 19:56:40
【问题描述】:
为什么在下面的作业中..
d = deque('abc')
a = d
d.clear()
print a
双端队列([])
返回一个空的双端队列?尽管清除了旧的双端队列,但我希望将数据保留在 a 中。
【问题讨论】:
标签: python collections deque
为什么在下面的作业中..
d = deque('abc')
a = d
d.clear()
print a
双端队列([])
返回一个空的双端队列?尽管清除了旧的双端队列,但我希望将数据保留在 a 中。
【问题讨论】:
标签: python collections deque
>>> 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
【讨论】:
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)
【讨论】: