2016-08-24 68 views
3

它被寫成here Python具有原子和引用對象類型。原子對象是:int,long,complex。 當分配原子對象時,它的值被複制,當分配引用對象時,它的引用被複制。python原子數據類型

我的問題是: 爲什麼然後,當我做的代碼波紋管我得到'真'?

a = 1234 
b = a 
print id(a) == id(b) 

在我看來,我不復制價值,我只是複製引用,不管它是什麼類型。

+7

那頁錯了。 – vaultah

+5

在Python中,簡單賦值('name = something')永遠不會創建副本。請參閱[Ned Batchelder](http://stackoverflow.com/users/14343/ned-batchelder)[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html)。 –

+1

Python只有引用。更有趣的是他們是否引用了可變或不可變對象。 – spectras

回答

4

Python中的賦值(綁定)從不復制數據。它始終複製對被綁定值的引用。

解釋器計算右側的值,左側通過引用將其綁定到新值。如果右側的表達式是現有值(換句話說,如果沒有運算符需要計算其值),那麼左側將是對同一對象的引用。

a = b 

執行後,

a is b 

將永遠是真實的 - 這是分配在Python中是如何工作的。容器也是如此,因此x[i].some_attribute = y將使x[i].some_attribute is y爲真。

斷言Python的原子類型和引用類型對我來說似乎沒有幫助,如果不是簡單的不真實。我會說它有原子類型和容器類型。容器就像列表,元組,字典和具有私有屬性的實例(第一次近似)。

+0

感謝您的回答! –

0

int類型是不可變的。 你看到的是數字1234的參考,並且永遠不會改變。

像列表可變對象,字典,你可以使用

import copy 
a = copy.deepcopy(b) 
0

其實像@spectras說,有隻引用,但也有像float S,int S,tuple小號不可變對象。對於不可變的對象(除了內存消耗),只要傳遞引用或創建副本就沒有關係。

的解釋,甚至做了一些優化,利用數以相同的值可以互換制定檢查身份證號碼有趣的,因爲例如,對於

a=1 
b=1 
c=2/2 
d=12345 
e=12345*1 

a is b是真實的,a is c也是如此,但d is e是假的(==按預期正常工作)

不可變的對象是原子的方式改變他們是線程安全的,因爲你實際上並沒有改變對象本身,而只是在一個變量(這是線程安全)中添加一個新的引用。