python - 为什么执行 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()
这会出错。
解决方案
这与范围有关。
这样做时:
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 变量。
推荐阅读
- python - Pyspark:如何创建新列并将列的值条件与行值匹配
- java - Spring MVC 与 Spring Boot 与 Spring
- html - 隐藏内容显示并向下滚动时,Chrome 页面会跳转/闪烁
- angular - 禁用 ngx-bootstrap 弹出窗口?
- swift - 如何获取通知权限状态(Swift)?
- c++ - 使用 istream 和 ostream 对象作为类 c++ 的数据成员
- palantir-foundry - 如何在 Contour 中按两列对表格进行排序?
- arm - Cortex M 处理器如何获取指令
- python - 用于条件返回的python docstring
- r - R使用case_when按组跟踪列中的更改