簡體   English   中英

如何定義自由變量

[英]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()

seriestotalsum都被視為 free_variable。 相反, totalsum現在是局部變量 (?),因為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 使它們成為自由變量?

如果沒有 nonlocal, total += value會分配給total ,默認情況下會創建一個局部變量。 由於total在 function averager的本地 scope 中,它不再是一個自由變量。

暫無
暫無

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

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