当前位置:Gxlcms > Python > Python使用list作为函数参数时,参数是否会初始化?

Python使用list作为函数参数时,参数是否会初始化?

时间:2021-07-01 10:21:17 帮助过:70人阅读

看到了这样一段代码:

def foo(a, b=[]):
    b.append(a)
    print b

回复内容:

>>> def foo(bar=[]):
...     return bar
>>> foo.func_name
'foo'
>>> foo.func_defaults
([],)
>>> foo() is foo.func_defaults[0]
True
官方文档解释在这里:default args 的求值是在定义的时候,只做一次
4. More Control Flow Tools

但是……
>>> def f(a, b=[]):
...     b.append(a)
...     print b
... 
>>> f(1)
[1]
>>> f(1)
[1, 1]
>>> def f(a, b=None):
...     b = b if b is not None else []
...     b.append(a)
...     print b
... 
>>> f(1)
[1]
>>> f(1)
[1]
>>> f(1)
[1]
>>> a = []
>>> b = []
>>> a.append(1)
>>> b
[]
>>> 
啥都不用说,加一个id()输出b的所谓的地址,你就明白了

no, def foo(a=[]) 这种函数参数写法叫 参数默认值,只会在函数声明是初始化一次。之后不会再变了。

note, 建议了解一下 def foo(a=[])和 foo(a=[])的区别:前者是参数默认值,后者是keyword arguments. 还有这种def foo(*args, **kargs) 和 这种 foo(*args, **kargs), 都是有细微区别的。 不会的, 默认值之间是共享的, 只会创建一次, 并不会每次创建一个新的对象. 也就是说使用可变对象作为函数的默认值时会导致函数的混乱. 同理使用字典作为默认参数,会得出类似的返回.
def foo(k,v, fdict={}):
    fdict[k] = v
    print fdict
foo(1,2)
foo(3,4)

人气教程排行