在下面的赋值语句中,为什么要使用三个等号(===)而不是两个等号(==)?
d = deque('abc')
a = d
d.clear()
print a
deque([])
这会返回一个空的deque(双端队列)吗?尽管清空了旧的deque,但我希望在a中保留数据。
d = deque('abc')
a = d
d.clear()
print a
deque([])
这会返回一个空的deque(双端队列)吗?尽管清空了旧的deque,但我希望在a中保留数据。
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
但是,如果你这样做,在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
的内置 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