伙计们,我有一个关于将可变对象传递给函数的问题
使用以下代码,我期望输出为[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
如果我想在函数内部完成上述任务,我该如何优雅地编写它?
非常感谢!
答案 0 :(得分:8)
def lala(a):
n = [0, 0 , 0]
a = n
这是正在发生的事情。
a
。n
。n
的名单提供附加名称a
。a
和n
都是lala
函数的本地名称,因此当函数结束时它们会“过期”。换句话说,a
不是可以放置新列表的框。这是您给出的名单的名称。稍后,您将该名称重新分配给名为n
的列表。
其他人建议使用切片分配a[:] = n
,它使用对列表中项目的引用而不是列表本身。执行此操作时,名称a
仍指向同一列表;它的内容刚刚被取代。由于它是传递给函数的相同列表,因此在函数外部知道它的任何名称都将“看到”新内容。
答案 1 :(得分:3)
有点提供了一个很好的解释,但我做这样的事情的首选方法是让函数返回更改而不是搞乱引用。
def lala():
n = [0, 0, 0]
return n
a = [0, 1, 2, 3]
a = lala()
print a # prints [0, 0, 0]
答案 2 :(得分:2)
你可以在函数中使用a[:] = n
。这称为切片分配
答案 3 :(得分:2)
python没有按引用调用的功能。没有一般方法可以做到这一点。
如果您知道您的参数将成为一个列表,并且您希望它采用不同的值,您可以这样写:
def lala(a):
a[:] = [0,0,0]
答案 4 :(得分:1)
那是因为一个功能会产生新标签" 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'指着。 (虽然赋值只是更改为给定标签指向的对象)
答案 5 :(得分:0)
请注意您的功能与此功能之间的区别:
def lala(a):
a[0] = 7
a = [0,1,2,3]
lala(a)
print a # prints [7, 1, 2, 3]