2016-08-24 81 views
-1

很多關於python pass-by-object-reference的文章已經寫了。但是閱讀像thisthis這樣的線程會令人困惑。傳遞對象引用和可變性

在那些線程中,有人說可變性很重要,而另一些人則說可變或不可變對象的處理方式是一樣的。

我有一個簡單的問題,爲什麼a的內容沒有在第一段代碼中修改並在第二段中修改?根據傳遞對象引用的this explanation,不應該在兩種情況下都修改引用的內容?

def fn(b): 
    b += 1 
a = 2 
fn(a) 
print(a) 

def fn(b): 
    b += [4] 
a = [2] 
fn(a) 
print(a) 
+0

您鏈接到的包含大量信息的帖子(不是線索; SO不是論壇)。請閱讀可用的答案,而不是要求我們重印它們。 – TigerhawkT3

+0

從技術上講,Python使用「[通過共享呼叫](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)」,這是一個晦澀的術語。另外,你的困惑確實源於對Python變量的根本誤解。 Python中的變量就像我們放置在對象上的名稱標籤。當我們將一個參數傳遞給一個函數時,我們將該參數給出的名稱標記放在該對象上。 –

回答

0

不應該參考的內容,在這兩種情況下進行修改?

不,因爲int對象是不可變的。

你甚至不需要功能來證明這一點。

考慮以下幾點:

a = 1 
print(id(a)) 
a += 1 
print(id(a)) 
>> 496418832 
    496418848 

顯然,我們得到一個新的對象。

對比:

a = [1] 
print(id(a)) 
a += [2] 
print(id(a)) 
>> 36641608 
    36641608 

a仍引用在這種情況下,同一個對象。

+0

你對id的使用確實爲我澄清了一些事情。謝謝! –