繁体   English   中英

python将参数传递给函数

[英]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

这是正在发生的事情。

  1. 您将收到一个参数(在这种情况下为列表),并将其命名为a
  2. 您正在创建一个新列表,并将其命名为n
  3. 您将给您命名为n的列表附加名称a
  4. 名称an都是lala函数的本地名称,因此它们在函数结束时“过期”。
  5. 您在函数中创建的列表现在没有名称,Python会丢弃它。

换句话说, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM