2012-07-27 29 views
5

我對Python很陌生(但對編程知之甚少),但我記得讀過python通常不會複製值,所以任何語句a = b都會使b指向a。如果我運行python byRef //複製

a = 1 
b = a 
a = 2 
print(b) 

給出結果1.應該不是2?

回答

10

否,結果應爲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打交道時,而不是一成不變的對象intfloattuple這整個區別真的是最重要的。

現在考慮下面的代碼:

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. 
+0

感謝您的解釋。我認爲a = 2時,我會改變從1到2的任何指向,但從你說的話來看,我似乎改變了a指向的位置(代替2而不是1) – user1266138 2012-07-27 15:03:16

+0

@ user1266138 - 是的。這是一個適當的思考方式。 (雖然在python中我們通常說「參考」而不是「點」,但這實際上只是語義)。 – mgilson 2012-07-27 15:04:18

3

當您執行b = a,這讓b指向相同值的指。然後,當您執行a = 2時,它會引用一個新值。 b不受影響。

Python中的有關分配規則:

  1. 分配只是使名指的是價值。

  2. 賦予名稱永遠不會影響引用舊值的其他名稱。

  3. 數據不會被隱式複製。

0

你可以通過一個小小的改變就能看到你期望的結果。這兩個變量確實開始指向同一個對象,並且如果該對象是可變的,那麼您可以同時在兩個地方看到變化。

>>> a = [1] 
>>> b = a 
>>> a[0] = 2 
>>> print b 
[2] 

你與你的例子所做的是改變a,使其不再引用的對象1而是對象2。剩下的b仍然指1

2

@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. 
+0

感謝澄清 – user1266138 2012-07-27 15:05:20