default value for the function python
我试图理解这个问题和答案:
python函数默认参数只计算一次?
为了理解它,我尝试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| def f1(a, L=[]):
if not L:
print"L is empty"
L = []
L.append(a)
return L
>>>f1(1)
L is empty
[1]
>>>f1(1)
L is empty
[1]
def f2(a, L=[]):
if L:
print"L isn't empty"
L = []
L.append(a)
return L
>>>f2(1)
[1]
>>>f2(1)
L isn't empty
[1] |
因此,我认为,在f1L的情况下,每次调用f1后,它都会再次分配给[]。但对于f2的情况,L不知何故不是空的?为什么?
- 也许你可以把我列为全球名单?
- 我可以,但不想。我只想知道为什么这个函数的行为如此奇怪
当你这样做的时候:
…您不更改L引用的值;您更改引用L指向一个全新的列表[]。
如果要清空L引用的列表,而不更改引用本身,则可以写入:
…或者使用诸如remove或pop这样的方法通过更改当前列表来工作。
下面是F1和F2动画形式,帮助您理解。(单击指定WebM。等待每个GIF都变白。gifs不同步,抱歉。)
- 你能解释一下为什么在f2的情况下,我有非空的列表,但在f1的情况下,尽管两个函数中的代码都是相似的,但它总是有效的吗?
- @用户3572950在f1(x)中,L=[]运行if not L分支,它丢弃L引用,所以下次运行f1(y)时,它仍然从L=[]开始。当你第一次给f2(x)打电话时,L=[]就跳过if L分支,直接用L.append换L。当你打电话给f2(y)和L=[x]时,你就通过if L分支(并放弃L引用)。
- @用户是的,就是这样:当你分配给l时,你给参考l分配一个新的值,而不影响前一个值。考虑一下:A=B=[]; A.append(0); print A, B; A=[]; A.append(1); B.append(2); print A, B;,这应该给[0] [0][1] [0, 2]。
- 也许我开始明白了-每个函数中有两个L的"版本"-一个"版本"是默认变量,只评估一次,另一个"版本"-新列表,我在if语句中创建的,正如您所说的,您将引用l更改为指向一个全新的列表[],但我不清楚为什么下次您这样做运行f1(y),此时仍以l=[]开始,当我运行f1第二次时,有两个l的"版本"—一个等于[],另一个等于[1],那么if语句如何理解它应该使用的L的"版本"?
- @GR4K也许一幅动人的图画值一千个字。(固定2)
- @gr4k这里是f2,为了完整和清晰。