2014-10-09 50 views
-3

今天我参加了计算机科学课,老师在板子上放了一段python编码,并说他不知道为什么它不工作。他向我们展示的功能,说:Python函数是否修改它们的参数?

def app(x): 
    x.append(" ") 
    print(x) 

def ext(x,y): 
    x.extend(y) 
    print(y) 

nums = [1,2,3,4,5,6] 
numbers = [7,8,9,10] 

app(nums) 
ext(nums,numbers) 

print("End of program") 

的代码是为了展示如何,当你不输入

return x 
在功能

那么当您返回到该变量不发生变化主程序然而,当他跑的程序,首先添加函数的空间,并保持它存在时,它返回导致下面的文本正在印刷...

['1','2','3','4','5','6',' '] 
['1','2','3','4','5','6',' ','7','8','9','10'] 
End of program 

请帮助我。

+1

到底是什么问题? – 2014-10-09 21:37:07

+1

您正在操作'nums'和'x'引用的对象。你并没有操纵'x'指的是什么。如果你的手指指向月亮(而不是月亮本身),那么你没有改变你的手指指向的地方,而是实际上跟着手指并在月球上划上了一面旗帜。 – 2014-10-09 21:38:07

+3

你需要一个更好的老师......一个对象和对该对象的引用之间的区别(实际上是在这个示例中传递的)是非常非常基本的。 – Cameron 2014-10-09 21:38:33

回答

2

你说的重点是要证明一个列表不会被改变,除非它被返回。这是错误的。该列表是一个可变对象。当你通过它(的名字)并改变它,它会被改变。如果您不想要更改,则需要使用副本。

+0

+1用于识别那里的问题并解释可变对象 – 2014-10-09 21:43:02

+1

虽然,我会指出这是通过“通过引用”和不是“按名称”。您应该编辑您的答案以包含该更改。 – b4hand 2014-10-09 21:44:21

+0

这不是通过引用传递。 “通过引用传递”是一种技术,其中函数中的参数是对调用方中名称的引用。这在Python中是不可能的。但你是对的,它也不是“通过名字”! Python的最佳术语是“通过共享”。 – 2014-10-09 22:07:48

0
def app(x): 
    return x + [" "] 


def ext(x,y): 
    return x + y 

可能是你正在尝试做的...林不知道,这不会改变任何原有名单,但将返回一个新的列表作为结果