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

看到了这样一段代码:

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)

Posted in 未分类

发表评论