看到了这样一段代码:
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 fdictfoo(1,2)foo(3,4)