2012-04-22 212 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