爲什麼在以下分配..意外的雙端隊列蟒蛇行爲
d = deque('abc')
a = d
d.clear()
print a
雙端隊列([])
返回一個空的雙端隊列?儘管清除了舊的雙端隊列,但我希望保留a中的數據。
爲什麼在以下分配..意外的雙端隊列蟒蛇行爲
d = deque('abc')
a = d
d.clear()
print a
雙端隊列([])
返回一個空的雙端隊列?儘管清除了舊的雙端隊列,但我希望保留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
這將是不同的在你使用它之後。
>>> 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
不創建一個副本 - 它只是創造了同一個對象的另一個名字。
要創建一個副本,這樣做:
d = deque('abc')
a = deque(d)