以下(荒诞而是说明性的)代码的工作通过突变在封闭函数定义的列表作为预期:对象可变性对Python的作用域有什么影响?
def outside1():
l = list('abcd')
def inside(a):
print "Before - %i: %r" % (id(l), l)
l.append(a)
print "After - %i: %r\n" % (id(l), l)
return inside
f = outside1()
[f(c) for c in 'efgh']
该代码也可以表示,在一个封闭的范围限定的不可变的是封闭范围内的访问:
def outside2():
t = tuple('abcd')
def inside():
print "%i: %r" % (id(t), t)
return inside
outside2()()
但是这个失败local variable 't' referenced before assignment
:
def outside3():
t = tuple('abcd')
def inside(a):
print "Before - %i: %r" % (id(t), t)
t = t + (a,)
print "After - %i: %r\n" % (id(t), t)
return inside
f = outside3()
[f(c) for c in 'efgh']
可有人è xplain这里发生了什么?我的第一个猜测是,我可以进行变异,但不能指定为封闭范围,但是如果outside2
工作,我至少应该在打印声明之前工作。
“Python在编译时静态检测名称的范围”谢谢,这是简短的答案; py3k的提示是一个不错的奖励。 – Finn 2012-03-23 14:17:53