【问题标题】:default value for the function python函数python的默认值
【发布时间】:2015-03-15 15:54:29
【问题描述】:

我正在尝试理解这个问题和答案:

python function default parameter is evaluated only once?

为了理解它,我尝试:

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]

所以我认为在f1 的情况下,L 每次都会再次变为空 - 在每次调用f1 后,它都会再次分配给[]。但万一f2 L 不知何故不为空?为什么?

【问题讨论】:

  • 也许你可以让 L 成为一个全局列表?
  • 我可以,但不想要。我只想了解为什么这个函数的行为如此奇怪

标签: python


【解决方案1】:

当你这样做时:

L = []

...您不会更改L 引用的值;您将 reference L 更改为指向一个全新的列表 []

如果你想清空L引用的列表而不改变引用本身,你可以这样写:

del L[:]

...或使用removepop 等方法,通过更改当前列表来工作。


这里是动画形式的 f1 和 f2,以帮助您理解。 (点击查看 webm。等待每个 gif 渐变为白色。gif 不同步,抱歉。)

【讨论】:

  • 你能解释一下为什么在f2的情况下我有非空列表,但在f1的情况下,尽管两个函数中的代码相似,但它总是空的?
  • @user3572950 in f1(x), L=[],因此你运行 if not L 分支,它丢弃了 L 引用,所以下次你运行 f1(y) 时,它仍然会启动与L=[]。当你第一次调用f2(x) 时,L=[],所以你跳过if L 分支并直接将L 更改为L.append。然后当您调用f2(y)L=[x] 时,您将通过if L 分支(并丢弃L 引用)。
  • @user 是的,就是这样:当您分配给 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 的“版本”——一个等于 [],另一个等于 @ 987654358@ ,那么if 语句如何理解它应该使用的L 的“版本”?
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多