python函數預設參數為可變對象的理解

來源:互聯網
上載者:User

標籤:code   賦值   返回   數列   close   代碼執行   情況   可變對象   如何   

1.代碼在執行的過程中,遇到函數定義,初始化函數產生儲存函數名,預設參數初識值,函數地址的函數對象。

2.代碼執行不在初始化函數,而是直接執行函數體。

代碼執行個體

 

這要從函數的特性說起,在 Python 中,函數是第一類對象(function is the first class object),換而言之,函數也是對象,跟整數、字串一樣可以賦值給變數、當做參數傳遞、還可以作為傳回值。函數也有自己的屬性,比如函數的名字、函數的預設參數列表。

# 函數的名字

>>> func.__name__

  ‘func‘

  # 函數的預設參數列表

>>> func.__defaults__

  ([ 1, 1, 1, 1, 1], 1)

def是一條可執行語句,Python 解譯器執行 def 語句時,就會在記憶體中就建立了一個函數對象(此時,函數裡面的代碼邏輯並不會執行,因為還沒調用嘛),在全域命名空間,有一個函數名(變數叫 func)會指向該函數對象,記住,至始至終,不管該函數調用多少次,函數對象只有一個,就是function object,不會因為調用多次而出現多個函數對象。

函數對象產生之後,它的屬性:名字和預設參數列表都將初始化完成。

初始化完成時,屬性 __default__ 中的第一個預設參數 numbers 指向一個空列表。

當函數第一次被調用時,就是第一次執行 func()時,開始執行函數裡面的邏輯代碼(此時函數不再需要初始化了),代碼邏輯就是往numbers中添加一個值為1的元素

第二次調用 func(),繼續往numbers中添加一個元素

第三次、四次依此類推。

所以現在你應該明白為什麼調用同一個函數,傳回值確每次都不一樣了吧。因為他們共用的是同一個列表(numbers)對象,只是每調用一次就往該列表中增加了一個元素

如果我們顯示地指定 numbers 參數,結果截然不同。

>>> func(numbers=[ 10, 11])

[ 10, 11, 1]

因為numbers被重新賦值了,它不再指向原來初始化時的那個列表了,而是指向了我們傳遞過去的那個新列表對象,因此傳回值變成了 [10, 11, 1]

那麼我們應該如何避免前面那種情況發生呢?就是不要用可變對象作為參數的預設值。

正確方式:

>>> deffunc(numbers=None, num=1):

... ifnumbers isNone:

... numbers = [num]

... else:

... numbers.append(num)

... returnnumbers

...

 

 

python函數預設參數為可變對象的理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.