将list作为参数传递给python函数的问题

时间:2017-10-25 07:43:37

标签: python

def foo(val, arr=[]):
    arr.append(val)
    return arr

print(foo(1)) ---> outputs [1]
print(foo(2)) ---> outputs [1, 2]

上面发生是因为默认值(空列表)在编译函数时被评估一次,然后在每次调用函数时重新使用。如果是这种情况,那么我无法理解下面的python代码的输出

def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
    print(l) 

f(2)
f(3,[3,2,1])
f(3)
#This outputs below
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]

此处在第二个调用f()中,列表已更改为[3, 2, 1, 0, 1, 4]但在第三次调用f()时使用在第一个调用f()中创建的列表,即[0, 1]

在第二次f()调用期间,我无法理解第三次调用是如何使用list crated的。

1 个答案:

答案 0 :(得分:2)

列表http://docs.python-guide.org/en/latest/writing/gotchas/

中的第一个问题

列表只创建一次,因此如果您修改它,则下次使用该修改版本。

在第二个电话f(3, [3,2,1]);它没有使用默认列表,而是使用您提供的列表。 因此,当您第三次拨打电话时,您正在使用默认列表,该列表仅在第一次调用时进行了修改。

作为示例,使用id查找每个对象的内存地址:

def foo(a=[]):
    print id(a)

foo()   #140378224732136
foo([]) #140378224687944
foo()   #140378224732136