好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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  ) 
  

查看更多关于Python使用list作为函数参数时,参数是否会初始化?的详细内容...

  阅读:39次