【发布时间】:2012-04-08 02:23:14
【问题描述】:
以下(荒谬但说明性的)代码通过改变封闭函数中定义的列表按预期工作:
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']
有人可以解释这里发生了什么吗?我的第一个猜测是我可以改变但不能分配给封闭范围,但鉴于outside2 有效,我至少希望 before 打印语句有效。
【问题讨论】: