[英]How to re-use the same function but call it from different locations in python in same test script
[英]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.