【发布时间】:2017-07-19 15:26:50
【问题描述】:
考虑以下假设代码:
class B(object):
def __init__(self):
self.b = 2
def foo(self):
out1 = [eval('self.b')] # ok
print(out1) # prints: [2]
out2 = [eval(cmd) for cmd in ['self.b']] # fails
print(out2) # NameError: name 'self' is not defined
b = B()
b.foo()
为什么out1 的语句正常,但out2 的语句不正常,导致错误“'self' is not defined”?
我正在学习 Python,在尝试 eval 时遇到了这个问题。是的,我知道在这个例子中使用eval 是不合适的,但只是为了从表面上看这个例子,有人可以解释为什么out2 的语句会给出错误消息吗?看来这两个语句都应该起作用并给出相同的结果。
感谢您的指导。
【问题讨论】:
-
因为您使用列表理解定义了一个没有自我的新范围?
-
请注意,您的代码可以在 Python 2 中运行,因为当时 LC 并没有引入新的作用域。
标签: python python-3.x eval list-comprehension