Python 参数的默认值
可能重复:Python 参数的默认值,python,function,default-arguments,Python,Function,Default Arguments,可能重复: 考虑以下功能: def foo(L = []): L.append(1) print L def goo(a = 0): a += 1 print a 每次我调用foo时,它都会打印一个新列表,其中包含比上次更多的元素,例如: >>> foo() [1] >>> foo() [1, 1] >>> foo() [1, 1, 1] 现在考虑以下函数: def foo(L = []): L.append(1)
考虑以下功能:
def foo(L = []):
L.append(1)
print L
def goo(a = 0):
a += 1
print a
每次我调用foo时,它都会打印一个新列表,其中包含比上次更多的元素,例如:
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]
现在考虑以下函数:
def foo(L = []):
L.append(1)
print L
def goo(a = 0):
a += 1
print a
当多次调用它时,我们得到以下图片:
>>> goo()
1
>>> goo()
1
>>> goo()
1
i、 e.它不会在每次调用时打印更大的值
这种看似不一致的行为背后的原因是什么?另外,在第一个示例中,为什么函数在调用之间保持状态?如何证明反直觉行为的合理性?定义函数时,默认参数只计算一次。 因此,每次调用函数时,您都会得到相同的
list
对象
每次调用第二个函数时,您也会得到相同的0
对象,但由于int
是不可变的,因此当您添加1
时,新对象需要绑定到
>>> def foo(L = []):
... print id(L)
... L.append(1)
... print id(L)
... print L
...
>>> foo()
3077669452
3077669452
[1]
>>> foo()
3077669452
3077669452
[1, 1]
>>> foo()
3077669452
3077669452
[1, 1, 1]
vs
这并不能完全回答我的问题-我不明白为什么第二个示例(带有整数参数)会像它那样工作。>每次调用第二个函数时,您也会得到相同的0对象--那么为什么每次调用第一个函数时,我不能得到相同的[]对象?@Grigory:整数是不可变的,
some_int+=…
创建一个新的整数,而不是修改some_int
a
以相同的0
开始,每次调用函数时,如果没有给定参数,您只需将a
更改为指向0+1
。事实上,每次调用第一个函数时,您都会得到相同的对象。这就是为什么它“记得”它以前的内容。@delnan谢谢,这解释了一切。以及关于同一个问题的许多其他答案。为什么我们突然得到这个问题无数次?