我遇到了 python 中的閉包,并且我一直在圍繞這個主題進行修補。如果我在這里錯了,請糾正我,但我對何時使用閉包(通常)的理解是它可以用作小類 ( q1) 的替代品并避免使用全局變量 ( q2)。Q1: [replacing classes]從該類創建的任何實例都datafactory將擁有自己的數據列表,因此每次附加到該對象的列表都會導致增量行為。我了解 OO POV 的輸出。class datafactory(): def __init__(self): self.data = [] def __call__(self, val): self.data.append(val) _sum = sum(self.data) return _sumincrementwith = datafactory()print(incrementwith(1))print(incrementwith(1))print(incrementwith(2))OUTPUT: 124我嘗試用閉包替換它,它成功了,但我對為什么/如何發生這種情況的理解有點模糊。def data_factory(): data = [] def increment(val): data.append(val) _sum = sum(data) return _sum return incrementincrement_with = data_factory()print(increment_with(1))print(increment_with(1))print(increment_with(2))OUTPUT:124我得到的是返回嵌套函數data_factory的函數定義以及一起發送的變量,如果它是這樣的,我會理解輸出:incrementdata112但是這個data列表究竟是如何在每次調用中都持續存在的呢?函數中定義的變量不應該在函數完成執行后消失,并在下一次 fn 調用時重新生成和清除嗎?注意:我知道這種行為通常存在于使用默認參數定義的函數中,例如def func(val, l = []):在每次 fn 調用時不會清除列表,而是使用新元素/附加更新,這也是我不完全理解的.我真的很感激對這兩種情況(OO 和閉包)中發生的事情進行學術解釋。Q2: [replacing use of global]有沒有一種方法可以在不使用全局變量或返回語句的情況下使用閉包來增加以下變量?a = 0print("Before:", a) # Before: 0def inc(a): a += 1print("After:", a) # After: 0感謝您的時間。
添加回答
舉報
0/150
提交
取消