簡體   English   中英

無法理解為什么當您重復調用同一函數時python不重用該參數

[英]Cannot understand why python doesn't re-use the parameter when you repeatedly call the same function

我正在觀看有關python的教程,它使用了以下示例:

def add_spam(menu=[]):
    menu.append("spam")
    return menu

如果您反復調用add_spam() ,則菜單列表的大小會增加。 這對我來說是新的,因為我來自C#背景。 但是,還可以。

要解決此問題,它說您應該將菜單參數設置為“ None但我不明白為什么這樣。 這是他們使用的代碼:

def add_spam(menu=None):
    if menu is None:
        menu = []
    menu.append('spam')
    return menu

如果您是第一次將菜單設置為[],並且第二次確定是否像第一個示例那樣“記住”參數,則菜單將是[],因此它將垃圾郵件附加到與第一個示例中的列表相同。

該視頻忽略了任何解釋,除了您應該使用不可變類型之外,因此我無法理解其工作原理。

編輯cos我還是不明白:

我看到的是該函數捕獲了變量,因此它使用menu = []並將其秘密存儲在某個地方,想象一個名為_menu的私有變量,這樣,如果再次調用它,它就不會重新求值,只會繼續使用_menu,因此它會增長。

在第二個示例中,我不明白為什么它不只是簡單地使用menu = None並將秘密存儲為_menu,所以_menu = None,然后當您調用第二個函數時,它將設置_menu = []並繼續按第一個例子,它不斷增長。

None是不可變的,這一事實與我似乎無關,因為您沒有執行None = []而是在執行menu = [],因此menu不再是以前的樣子,變成了[],您可以對其進行修改隨你心意。

除非是某些硬編碼功能,否則如果您將其設置為None,則不會執行復制行為,否則我將無法理解兩者之間的區別。

當定義函數時,Python的默認參數將被評估一次,而不是在每次調用函數時被評估(例如Ruby)。

https://docs.python-guide.org/writing/gotchas/

從Python的文檔中,可以獲得更多詳細信息:

執行功能定義時,默認參數值從左到右評估。 這意味着在定義函數時,表達式將被計算一次,並且每個調用使用相同的“預先計算”值。

https://docs.python.org/3/reference/compound_stmts.html#function-definitions

列表是可變對象,而“ None是不可變的,因此您可以看到行為。

在函數內部設置menu = []只是將名稱menu重新綁定到該函數調用范圍內的新對象。 它不會在定義函數的范圍內更改原始menu對象。 另一方面,附加到函數內的menu實際上會修改函數定義中與名稱menu關聯的內存中的對象(因為列表是可變的)。 該對象是在首次定義函數時創建的,並且在函數調用之間共享。

如果您想了解更多信息,請查看python作用域/命名空間行為,其默認參數共享通常只是其中的一部分。 但基本上

def foo(bar=None): #executed once
    bar = [] #executed every time the function is called 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM