看到了這樣一段代碼:
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)