如果您使用 for 循环而不是列表理解
它会起作用的。
class Test:
def __init__(self,a=0):
self.x = a
self.l = [2**x for x in range(a)] #<--- self.l = [1,2,4,8,16]
self.base()
def base(self):
# expr = "self.l{0} = [self.l[x]+{0} for x in range(self.x)]" #<--- when i=4, self.l4 = [5,6,8,12,20]
expr = '''
self.l{0} = []
for x in range(self.x):
self.l{0}.append(self.l[x]+{0})
'''
for i in range(self.x):
expr_formated = expr.format(i)
print(expr_formated)
exec(expr_formated)
w = Test(5)
print(w.l4)
列表理解实际上是使用 lambda 函数,如您所见python 文档. squares = [x**2 for x in range(a)]
实际上是squares = list(map(lambda x: x**2, range(a)))
. (编辑:最近我发现这不准确,请参阅我的问题,它们并不相同,但它们的工作方式相似;也许人们仍然可以使用lambda
如果不想引用 python 程序集,请理解这一点)但是,在内部创建一个函数对象(此处为 lambda 函数)exec()
会导致问题。我发question这里解释为什么创建函数对象不能按预期工作。简而言之,__closure__
定义的 lambda 函数的值被设置为 None,使得变量a
调用 lambda 函数时不可用。
如果你坚持使用lambda函数。
还有另一种解决方案。请参阅我的答案到前面提到的问题以获取更多信息。
class Test:
def __init__(self,a=0):
self.x = a
self.l = [2**x for x in range(a)] #<--- self.l = [1,2,4,8,16]
self.base()
def base(self):
expr = """
def closure_helper_func(self):
self.l{0} = [self.l[x]+{0} for x in range(self.x)]
closure_helper_func(self)""" #<--- when i=4, self.l4 = [5,6,8,12,20]
for i in range(self.x):
expr_formated = expr.format(i)
# print(expr_formated)
exec(expr_formated)
w = Test(5)
print(w.l4)