python将参数传递给函数

时间:2010-12-10 03:22:08

标签: python function arguments

伙计们,我有一个关于将可变对象传递给函数的问题

使用以下代码,我期望输出为[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

如果我想在函数内部完成上述任务,我该如何优雅地编写它?

非常感谢!

6 个答案:

答案 0 :(得分:8)

如果您考虑将名称标签附加到对象,而不是将对象填充到命名框中,那么Python会更有意义。

def lala(a):
    n = [0, 0 , 0]
    a = n

这是正在发生的事情。

  1. 您正在接收参数(本例中为列表)并为其指定名称a
  2. 您正在创建一个新列表,并将其命名为n
  3. 您将为名为n的名单提供附加名称a
  4. 这两个名称an都是lala函数的本地名称,因此当函数结束时它们会“过期”。
  5. 您在函数中创建的列表现在没有名称,Python会丢弃它。
  6. 换句话说,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]