[英]python passing argument to a function
乡亲,我有一个关于将可变对象传递给函数的问题
使用以下代码,我期望输出为[0,0,0],而输出为[0,1,2,3]
这是否意味着参数实际上已被复制,然后发送到函数内部?
def lala(a):
n = [0, 0 , 0]
a = n
a = [0,1,2,3]
lala(a)
print a
如果我想在函数中完成上述任务,该如何优雅地编写?
非常感谢!
如果您考虑将名称标签附加到对象,而不是将对象塞入命名框,则Python更有意义。
def lala(a):
n = [0, 0 , 0]
a = n
这是正在发生的事情。
a
。 n
。 n
的列表附加名称a
。 a
和n
都是lala
函数的本地名称,因此它们在函数结束时“过期”。 换句话说, a
不是可以在其中放入新列表的框。 这是您给您收到的清单的名称。 稍后,您将该名称重新分配给您还命名为n
的列表。
其他人建议使用切片分配a[:] = n
,该分配使用对列表中项目的引用而不是列表本身。 当您执行此操作时,名称a
仍指向同一列表。 它的内容刚刚被替换。 由于它是传递给该函数的相同列表,因此在函数外部已知的任何名称都将“看到”新内容。
我认为kindall提供了一个很好的解释,但是我做这种事情的首选方法是让函数返回更改而不是弄乱引用。
def lala():
n = [0, 0, 0]
return n
a = [0, 1, 2, 3]
a = lala()
print a # prints [0, 0, 0]
您可以在函数内部使用a[:] = n
。 这称为切片分配
python没有按引用调用功能。 没有一般的方法可以做到这一点。
如果您知道参数将是一个列表,并且希望它采用其他值,则可以这样编写:
def lala(a):
a[:] = [0,0,0]
这是因为一个函数为其作用域添加了新标签“ a”。 然后,此“ a”使您在函数外部定义的“ a”黯然失色。 因此,将新标签a分配给新对象[0,0,0,0]如果要编写:
def lala(a):
a.pop()
a = [0,1,2,3,4]
lala(a)
print(a)
您会看到a = [0,1,2,3],因为pop()实际上更改了标签'a'指向的对象。 (而分配只是更改给定标签所指向的对象)
请注意您的函数与此函数之间的区别:
def lala(a):
a[0] = 7
a = [0,1,2,3]
lala(a)
print a # prints [7, 1, 2, 3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.