[英]How to define a free variable
我目前正在閱讀這本書 Fluent Python - Luciano Ramalho(IMO 的一本好書)。
在關於裝飾器和閉包的章節中,有一段代碼如下:
def make_averager():
series = []
def averager(value):
series.append(value)
total = sum(series)
return total/len(series)
return averager
avg = make_averager()
所以在這種情況下, series
是一個自由變量,我可以通過打印來驗證這一點
>>> avg.__code__.co_varnames
('new_value', 'total')
>>> avg.__code__.co_freevars
('series',)
但是當我嘗試重構make_averager()
時:
def make_averager():
series = []
total = 0
count = 0
def averager(value):
total += value
count += 1
return total/count
return averager
avg = make_averager()
series
、 total
或sum
都被視為 free_variable。 相反, total
和sum
現在是局部變量 (?),因為avg.__code__.co_varnames
返回('value', 'total', 'count')
和avg.__code__.co_freevars
返回()
。
所以現在series
現在不再是averager
的 scope 中的自由變量,除非我添加
series.append(value)
內部averager(value)
。 這是可以理解的,因為我根本沒有在averager(value)
內部調用series
,但我無法理解這兩個變量發生了什么。
為什么total
count
不被視為自由變量,我如何將它們分配為自由變量?
def averager(value):
nonlocal total
nonlocal count
total += value
count += 1
return total/count
如果沒有 nonlocal, total += value
會分配給total
,默認情況下會創建一個局部變量。 由於total
在 function averager
的本地 scope 中,它不再是一個自由變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.