【问题标题】:The value of an empty list in function parameter, example here [duplicate]函数参数中空列表的值,此处为示例 [重复]
【发布时间】:2012-03-27 09:54:05
【问题描述】:

可能重复:
“Least Astonishment” in Python: The Mutable Default Argument

def f(a, L=[]):
    L.append(a)
    return L

print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))

我想知道为什么另一个 f(1), f(2), f(3) 没有附加到第一个 f(1, [1,2]) 上。 我猜结果应该是:

[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]

但结果不是这样。我不知道为什么。

【问题讨论】:

  • @Closevoters:从他的例子中可以明显看出,他确实希望默认参数会改变,所以不,不是任何重复。

标签: python function parameters


【解决方案1】:

将两个不同的问题(更好地称为概念)融合到一个问题陈述中。

第一个与 agh 所指出的 SO 问题有关。该线程给出了详细的解释,再次解释它没有任何意义,除非为了这个线程,我可以特权说函数是第一类对象,参数及其默认值在声明期间是有界的。所以参数的作用很像函数的静态参数(如果可以用其他不支持 First Class Function Objects 的语言来实现的话。

第二个问题是参数L绑定到什么List Object。传递参数时,传递的 List 参数是 L 所绑定的。当在没有任何参数的情况下调用时,它更像是与一个不同的列表(作为默认参数提到的那个)绑定,该列表与第一次调用中传递的内容不同。为了使案例更加突出,只需按以下方式更改您的函数并运行示例即可。

>>> def f(a, L=[]):
        L.append(a)
        print id(L)
        return L

>>> print(f(1, [1, 2]))
56512064
[1, 2, 1]
>>> print(f(1))
51251080
[1]
>>> print(f(2))
51251080
[1, 2]
>>> print(f(3))
51251080
[1, 2, 3]
>>> 

如您所见,与后续调用相比,第一次调用打印出参数L 的不同ID。因此,如果列表不同,那么行为和附加值的位置也会不同。希望现在它应该有意义

【讨论】:

  • 谢谢大家,我现在明白了。非常好。
【解决方案2】:

如果你调用函数来初始化空列表,如果你不传递第二个参数,为什么你要等待结果?

对于那些你想要的结果,你应该使用闭包或全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多