【发布时间】:2011-11-24 01:14:39
【问题描述】:
这点 Python 不行:
def make_incrementer(start):
def closure():
# I know I could write 'x = start' and use x - that's not my point though (:
while True:
yield start
start += 1
return closure
x = make_incrementer(100)
iter = x()
print iter.next() # Exception: UnboundLocalError: local variable 'start' referenced before assignment
我知道如何解决该错误,但请耐心等待:
这段代码运行良好:
def test(start):
def closure():
return start
return closure
x = test(999)
print x() # prints 999
为什么我可以读取闭包内的start 变量但不能写入它?
什么语言规则导致了start 变量的这种处理?
更新:我发现这篇 SO 帖子相关(答案比问题更重要):Read/Write Python Closures
【问题讨论】:
-
您在评论中提到的“重新绑定到局部变量”解决方案将比每次访问容器项执行得更好。它也更 Pythonic。请参阅我对替代方案的回答,这些替代方案也比仅针对副作用使用容器更具 Pythonic。
-
这确实与 Read/Write Python Closures 完全相同