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 )
查看更多关于Python使用list作为函数参数时,参数是否会初始化?的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did89796