Python 使用 list 作為函數參數時,參數是否會初始化?

來源:互聯網
上載者:User
看到了這樣一段代碼:

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)
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.