2014-12-04 51 views
3

爲什麼在以下分配..意外的雙端隊列蟒蛇行爲

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

雙端隊列([])

返回一個空的雙端隊列?儘管清除了舊的雙端隊列,但我希望保留a中的數據。

回答

5

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 

但隨後你會得到a和兩個不同的對象d這將是不同的在你使用它之後。

1
>>> 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 
4

行:

a = d 

不創建一個副本 - 它只是創造了同一個對象的另一個名字。

要創建一個副本,這樣做:

d = deque('abc') 
a = deque(d)