python函数中使用eval的疑惑?

问题如下:

class A:
    ...
    
o = A()
o.a = 0

def f(o,a):
    print(eval(o+'.'+a))

f('o','a') # AttributeError: 'str' object has no attribute 'a'

但是:

class A:
    ...
    
o = A()
o.a = 0

print(eval('o'+'.'+'a')) # 0

这是为什么呢?

阅读 4.2k
2 个回答

跟名字空间有关, eval() 官方文档是这样的:

eval(expression, globals=None, locals=None)

其中有:

  • globals: 全局名字空间
  • locals: 局部名字空间

两个可选属性.如果这两个都不写, eval 默认只能识别标准的 builtins 模块.

你定义的 f() 函数的局部名字空间不包含实例 o:

class A:
    def __init__(self):
        self.a = 10

o = A()
o.a    # 10

def f(o, a):
    print(eval(o + '.' + a, globals())

f('o', 'a')
class A:
    ...
o=A()
o.a=0
def f(o1,a1):
    print(eval(o1+'.'+a1))
# AttributeError: 'str' object has no attribute 'a'
f('o','a')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题