为什么在这个python代码中执行exec(';print(x)';)而print(x)出错?

为什么在这个python代码中执行exec(';print(x)';)而print(x)出错?,python,printing,syntax,local-variables,Python,Printing,Syntax,Local Variables,当我运行上面的代码时,python控制台将显示“1” 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() def main(): exec('x = 1') exe

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

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()
def main():
    exec('x = 1')
    exec('print(x)')
    
  
if __name__ == '__main__':  
    main()
当我运行上面的代码时,它将显示“name‘x’未定义”

他们之间有什么区别

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

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()
这将显示“1”

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()
def main():
    exec('x = 1')
    exec('print(x)')
    
  
if __name__ == '__main__':  
    main()
这将出错。

这与范围相关

执行此操作时:

def main():
exec('x=1')
打印(x)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
exec定义的x变量是局部变量,与传递给print()函数的x变量不同,后者是全局变量。除非你告诉它:

def main():
exec('global x;x=1')
打印(x)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
这对我有用,它打印1


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

修改
locals
是未定义的行为。感谢您的回答。我添加了更多细节,类似的错误仍然存在。使用
exec
修改局部变量也是未定义的行为。我假设可能是解释器不理解
exec('x=1')
实例化了一个新变量
x
,因此,在执行前校对第二个代码时,错误地假设它包含语法错误,而在第一个示例中,当通过
exec
call调用x时,它应该运行良好,因此语法检查通过得很好谢谢您的回答。但如果我将main()函数修改为:def main():x=1;打印(locals()['x']);打印(x),它打印“1/n1”。这意味着x仍然是一个局部变量,即使x由x=1定义。如果将main()修改为:def main():x=1;print(globals()['x'];print(x)),将发生键错误。