【发布时间】:2018-09-19 17:40:04
【问题描述】:
似乎python函数的闭包有问题,如果符号 引用已分配:
def outer():
p = []
def gen():
def touch(e):
if e[0] == 'add':
p.append(e);
elif e[0] == 'rem':
p = [ x for x in p if not (x[1] == e[1]) ]
return touch
f = gen()
for i in [["add","test1"],["add","test2"],["rem","test2"],["rem","test1"]]:
f(i)
outer();
结果是:
Traceback (most recent call last):
File "b.py", line 22, in <module>
outer();
File "b.py", line 20, in outer
f(i)
File "b.py", line 14, in touch
p.append(e);
UnboundLocalError: local variable 'p' referenced before assignment
如果我只是为了测试替换:
- p = [ x for x in p if not (x[1] == e[1]logig is) ]
+ a = [ x for x in p if not (x[1] == e[1]) ]
错误消失了,但是代码不是我想要的。 python 闭包/嵌套函数是否预期上述行为?我是否需要包装数组以在对象内部进行修改并只调用函数?
另一方面,这个可行:
class o():
def __init__(self):
self.p = []
def add(self,e):
self.p.append(e);
def rem(self,e):
self.p = [ x for x in self.p if not (x[1] == e[1]) ]
def outer():
p = o()
def gen():
def touch(e):
if e[0] == 'add':
p.add(e);
elif e[0] == 'rem':
p.rem(e)
return touch
f = gen()
for i in [["add","test1"],["add","test2"],["rem","test2"],["rem","test1"]]:
f(i)
outer();
【问题讨论】:
-
在触摸函数中定义 p 似乎可以正常工作
-
或者你可以定义
def touch(e, p):并使用touch(i, p)调用 -
@Alexander : 你在哪里对,我改了标题/例子