python函数调用继承

我是新人这是python文档的示例。

def funtest(num, L=[]):
    L.append(num)
    return L
print(funtest(2))
print(funtest(3))
print(funtest(4))

我认为非常函数调用应该执行相同的操作,这意味着非常函数调用中的L = []。所以我虽然输出应该是这样的:

[2]
[3]
[4]

但真正的答案在下面。看起来funtest()继承了上一个函数调用的输出。然后连续将其传递给下一个函数调用。我对此感到困惑。

[2]
[2, 3]
[2, 3, 4]

当我将代码更改为以下情况时:

def funtest(L=[]):
    L.append(L)
    return L
print(funtest([2]))
print(funtest([3]))
print(funtest([4]))

实际的输出是这样的:

[2, [...]]
[3, [...]]
[4, [...]]

输出结果与前一个完全不同。我现在比较困惑。有人能修复我的头脑吗?非常感谢

评论
  • adicta
    adicta 回复

    解释发生了什么,

    第一种情况

    因此python函数中的默认值仅在定义函数时实例化一次,因此仅在定义函数时创建列表,并不断添加该列表,现在结果包含所有较早的值

    当用作python中参数的默认值时,对于所有可变的值都是如此

    你能做什么 ?

    in general use immutable values , and for the case of list you use None as the default value and in the function you check if list is None and create one empty list inside the function

    read more here ( the first gotcha ) : https://docs.python-guide.org/writing/gotchas/

    第二例

    now you are actually creating infinite list by appending same list to itself when you are doing L.append(L)

    每当列表太大而无法打印时,python都会在其位置显示这三个点

    read more here What does [...] (an ellipsis) in a list mean in Python?

  • tut
    tut 回复

    您只需要在调用funtest函数之前创建数组并将该数组传递给所有函数即可:

    def funtest(num, L):
        L.append(num)
        return L
    L=[]
    print(funtest(2,L))
    print(funtest(3,L))
    print(funtest(4,L))
    

    你会得到预期的结果

  • qq情侣
    qq情侣 回复

    将L移到函数内部

    def funtest(num):
        L=[]
        L.append(num)
        return L
    print(funtest(2))
    print(funtest(3))
    print(funtest(4))
    

    这重新设置了L

    enter image description here