Default values for arguments
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument
考虑以下功能:
1 2 3 | def foo(L = []): L.append(1) print L |
每次我调用foo,它都会打印一个新的列表,其中包含比以前更多的元素,例如:
1 2 3 4 5 6 | >>> foo() [1] >>> foo() [1, 1] >>> foo() [1, 1, 1] |
现在考虑以下功能:
1 2 3 | def goo(a = 0): a += 1 print a |
当多次调用它时,我们得到以下图片:
1 2 3 4 5 6 | >>> goo() 1 >>> goo() 1 >>> goo() 1 |
也就是说,它不会在每次调用时打印更大的值。
这种看似不一致的行为背后的原因是什么?另外,在第一个示例中,如何证明反直觉行为,为什么函数在调用之间保持状态?
在定义函数时,将对默认参数进行一次计算。所以每次调用函数时都会得到相同的
每次调用第二个函数时,也会得到相同的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> def foo(a=0): ... print id(a) ... a+=1 ... print id(a) ... print a ... >>> foo() 165989788 165989776 1 >>> foo() 165989788 165989776 1 >>> foo() 165989788 165989776 1 |