2012-04-22 211 views
6
def change(s): 
    s = s + "!" 


word = "holiday" 
change(word)  
print word 

這是「假日」的輸出而不是「假期!」的輸出?是否因爲3行代碼在功能之外?如果是這樣,爲什麼它在功能之外,因爲它在更改功能之後呢?連接字符串?

+1

這說明您的情況更加普遍:http://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference – jdi 2012-04-22 17:48:50

+0

感謝您的幫助,JDI – alicew 2012-04-22 18:21:59

回答

6

試試這個:

def change(s): 
    return s + "!" 

使用方法如下:

word = 'holiday' 
print change(word) 

或者像這樣:

word = 'holiday' 
word = change(word) 
print word 

請注意,對函數內的參數字符串所做的任何修改都會在函數外部看到而不是,因爲函數中的s參數對於函數的作用域是本地的,並且您做的任何更改(如在問題中的代碼中)只會在函數內部可見,而不在外部。 Python中的所有函數參數都是passed by value

+0

非常感謝! :) – alicew 2012-04-22 17:45:29

+0

@alicew不客氣!請閱讀我答案最後一段中的鏈接,以充分理解函數內部字符串的情況。 – 2012-04-22 17:47:46

+0

@alicew也請不要忘記接受正確的答案(點擊左邊的複選標記)最有幫助的答案 – 2012-04-22 17:49:39

1

您沒有從變化中返回價值。

嘗試:

def change(s): 
    s = s + "!" 
    return s 


word = "holiday" 
word = change(word)  
print word 

因此,在上面的例子中,S是被修改,然後字重新分配將該修改值。

3

您只修改函數change中的局部變量s。這不會修改變量word。如果你想修改word,你需要將它返回change的結果,並分配給word

def change(s): 
    s = s + "!" 
    return s 


word = "holiday" 
word = change(word)  
print word 
1

您正在將單詞的「副本」而不是該單詞實例傳遞給該函數。因此更改應用到變量s你持有字的複製功能

+0

好的,謝謝! – alicew 2012-04-22 17:44:58

+1

那不是真的。 python傳遞了對該值的引用。他只是用當地的一個陰影變量 – jdi 2012-04-22 17:46:35

+0

那更正確的解釋;但在給定的情況下,它有助於解釋,由於陰影和不同的範圍,似乎你正在工作副本 – jbreicis 2012-04-22 17:50:16

1

change(s)s裏面,當你調用change(word)綁定到的word值的名稱。

s = s + "!"要綁定s,其是通過將勢必s!值創建一個新的字符串行了,沒有做任何事情來word

此外,即使有可能,最好不要有副作用,因此返回新值更好。

def change(s): 
    return s + '!' 
+1

感謝您的幫助:) – alicew 2012-04-22 17:45:53