我對Python很陌生(但對編程知之甚少),但我記得讀過python通常不會複製值,所以任何語句a = b都會使b指向a。如果我運行python byRef //複製
a = 1
b = a
a = 2
print(b)
給出結果1.應該不是2?
我對Python很陌生(但對編程知之甚少),但我記得讀過python通常不會複製值,所以任何語句a = b都會使b指向a。如果我運行python byRef //複製
a = 1
b = a
a = 2
print(b)
給出結果1.應該不是2?
否,結果應爲1。
認爲賦值運算符(=
)爲基準的分配的。
a = 1 #a references the integer object 1
b = a #b and a reference the same object
a = 2 #a now references a new object (2)
print b # prints 1 because you changed what a references, not b
與可變對象,如lists
打交道時,而不是一成不變的對象像int
,float
和tuple
這整個區別真的是最重要的。
現在考慮下面的代碼:
a=[] #a references a mutable object
b=a #b references the same mutable object
b.append(1) #change b a little bit
print a # [1] -- because a and b still reference the same object
# which was changed via b.
當您執行b = a
,這讓b指向相同值的指。然後,當您執行a = 2
時,它會引用一個新值。 b不受影響。
Python中的有關分配規則:
分配只是使名指的是價值。
賦予名稱永遠不會影響引用舊值的其他名稱。
數據不會被隱式複製。
你可以通過一個小小的改變就能看到你期望的結果。這兩個變量確實開始指向同一個對象,並且如果該對象是可變的,那麼您可以同時在兩個地方看到變化。
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
你與你的例子所做的是改變a
,使其不再引用的對象1
而是對象2
。剩下的b
仍然指1
。
@mgilson有一個偉大的answer但我覺得有點難以掌握。我將這個答案作爲試圖用不同的方式解釋它。
a = 1 # This makes a point to a location in memory where the Integer(1) is located
b = a # This makes b point to the same place.
a = 2 # This makes a point to a different location in memory where Integer(2) is located
print(b) # b still points to the place where Integer(1) was stored, so it prints out 1.
感謝澄清 – user1266138 2012-07-27 15:05:20
感謝您的解釋。我認爲a = 2時,我會改變從1到2的任何指向,但從你說的話來看,我似乎改變了a指向的位置(代替2而不是1) – user1266138 2012-07-27 15:03:16
@ user1266138 - 是的。這是一個適當的思考方式。 (雖然在python中我們通常說「參考」而不是「點」,但這實際上只是語義)。 – mgilson 2012-07-27 15:04:18