首页 > 解决方案 > 为什么执行 exec('print(x)') 而 print(x) 在此 python 代码中出错?

问题描述

def build(s, loc):
    exec(s, loc)
    return loc

def main():
    L = build('x = 1', locals())
    locals().update(L)
    exec('print(x)')

  
if __name__ == '__main__':  
    main()

当我运行上面的代码时,python 控制台将显示“1”。

def build(s, loc):
    exec(s, loc)
    return loc

def main():
    L = build('x = 1', locals())
    locals().update(L)
    print(x)
  

if __name__ == '__main__':  
    main()

当我运行上面的代码时,它会显示'name 'x' is not defined'。

它们之间有什么区别?

我修改了我的代码以减少歧义,类似的问题仍然存在。

def main():
    exec('x = 1')
    exec('print(x)')
    
  
if __name__ == '__main__':  
    main()

这将显示“1”。

def main():
    exec('x = 1')
    print(x)
    
  
if __name__ == '__main__':  
    main()

这会出错。

标签: pythonprintingsyntaxlocal-variables

解决方案


这与范围有关。

这样做时:

def main():
    exec('x = 1')
    print(x)


if __name__ == '__main__':  
    main()

exec 定义的 x 变量是本地的,与传递给 print() 函数的 x 变量不同,后者是全局的。除非你告诉它是:

def main():
    exec('global x;x = 1')
    print(x)
    
  
if __name__ == '__main__':  
    main()

这最终对我有用,它打印 1。

这是因为global在 exec() 中对 x 变量使用关键字后,您告诉解释器尽管在本地范围内,对 x 变量的任何进一步引用都将引用外部的、全局的、x 变量。


推荐阅读