我遇到了 python 中的閉包,并且我一直在圍繞這個(gè)主題進(jìn)行修補(bǔ)。如果我在這里錯(cuò)了,請(qǐng)糾正我,但我對(duì)何時(shí)使用閉包(通常)的理解是它可以用作小類 ( q1) 的替代品并避免使用全局變量 ( q2)。Q1: [replacing classes]從該類創(chuàng)建的任何實(shí)例都datafactory將擁有自己的數(shù)據(jù)列表,因此每次附加到該對(duì)象的列表都會(huì)導(dǎo)致增量行為。我了解 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我嘗試用閉包替換它,它成功了,但我對(duì)為什么/如何發(fā)生這種情況的理解有點(diǎn)模糊。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我得到的是返回嵌套函數(shù)data_factory的函數(shù)定義以及一起發(fā)送的變量,如果它是這樣的,我會(huì)理解輸出:incrementdata112但是這個(gè)data列表究竟是如何在每次調(diào)用中都持續(xù)存在的呢?函數(shù)中定義的變量不應(yīng)該在函數(shù)完成執(zhí)行后消失,并在下一次 fn 調(diào)用時(shí)重新生成和清除嗎?注意:我知道這種行為通常存在于使用默認(rèn)參數(shù)定義的函數(shù)中,例如def func(val, l = []):在每次 fn 調(diào)用時(shí)不會(huì)清除列表,而是使用新元素/附加更新,這也是我不完全理解的.我真的很感激對(duì)這兩種情況(OO 和閉包)中發(fā)生的事情進(jìn)行學(xué)術(shù)解釋。Q2: [replacing use of global]有沒有一種方法可以在不使用全局變量或返回語(yǔ)句的情況下使用閉包來(lái)增加以下變量?a = 0print("Before:", a) # Before: 0def inc(a): a += 1print("After:", a) # After: 0感謝您的時(shí)間。
添加回答
舉報(bào)
0/150
提交
取消