它被寫成here Python具有原子和引用對象類型。原子對象是:int,long,complex。 當分配原子對象時,它的值被複制,當分配引用對象時,它的引用被複制。python原子數據類型
我的問題是: 爲什麼然後,當我做的代碼波紋管我得到'真'?
a = 1234
b = a
print id(a) == id(b)
在我看來,我不復制價值,我只是複製引用,不管它是什麼類型。
它被寫成here Python具有原子和引用對象類型。原子對象是:int,long,complex。 當分配原子對象時,它的值被複制,當分配引用對象時,它的引用被複制。python原子數據類型
我的問題是: 爲什麼然後,當我做的代碼波紋管我得到'真'?
a = 1234
b = a
print id(a) == id(b)
在我看來,我不復制價值,我只是複製引用,不管它是什麼類型。
Python中的賦值(綁定)從不復制數據。它始終複製對被綁定值的引用。
解釋器計算右側的值,左側通過引用將其綁定到新值。如果右側的表達式是現有值(換句話說,如果沒有運算符需要計算其值),那麼左側將是對同一對象的引用。
a = b
執行後,
a is b
將永遠是真實的 - 這是分配在Python中是如何工作的。容器也是如此,因此x[i].some_attribute = y
將使x[i].some_attribute is y
爲真。
斷言Python的原子類型和引用類型對我來說似乎沒有幫助,如果不是簡單的不真實。我會說它有原子類型和容器類型。容器就像列表,元組,字典和具有私有屬性的實例(第一次近似)。
感謝您的回答! –
int類型是不可變的。 你看到的是數字1234的參考,並且永遠不會改變。
像列表可變對象,字典,你可以使用
import copy
a = copy.deepcopy(b)
其實像@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
是假的(==
按預期正常工作)
不可變的對象是原子的方式改變他們是線程安全的,因爲你實際上並沒有改變對象本身,而只是在一個變量(這是線程安全)中添加一個新的引用。
那頁錯了。 – vaultah
在Python中,簡單賦值('name = something')永遠不會創建副本。請參閱[Ned Batchelder](http://stackoverflow.com/users/14343/ned-batchelder)[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html)。 –
Python只有引用。更有趣的是他們是否引用了可變或不可變對象。 – spectras