python - Python 导入和全局变量
问题描述
假设我有一个文件:
# main.py
import foo
my_global = "global variable"
foo.print_global()
另一个:
# foo.py
def print_global():
global my_global
print(my_global)
为什么NameError: name 'my_global' is not defined
我跑步时会得到main.py
?我怎样才能my_global
提供给foo.py
?尝试是不是一个坏主意-也许在这种情况下我应该始终将值作为函数参数传递?
解决方案
Python 没有进程范围的全局变量,只有模块级的全局变量。foo.print_global
看foo.my_global
,不是main.my_global
,这是你设置的。也就是说,print_global
用于全局变量的范围是在定义时print_global
确定的,而不是在调用时确定的。
这会做你所期望的。
import foo
foo.my_global = "global variable"
foo.print_global()
请注意,foo.py
在调用之前不应依赖其他人创建其全局变量print_global
;至少,foo.py
应该初始化my_global
为None
,如果不是其他默认值的话。
另请注意,上述解决方案与
from foo import my_global
my_global = "..."
这会在当前模块中创建一个新的全局名称,该名称使用 的当前值进行初始化foo.my_global
。随后的赋值更改了“本地”全局变量的名称,而不是foo.my_global
.
推荐阅读
- javascript - 如何在将原始数据附加到表中并在名为 sub_total 的 id 中显示所有价格后在 jquery 中求和价格
- json - 序列化具有与该对象相同类型的类成员的对象时如何解决循环引用
- python - 7 段显示tkinter
- sql - 已找到 ID 的 SQL SELECT 查询
- visual-studio-app-center - 如何通过推送通知将用户发送到 URL
- spring-boot - 无法在 Spring Boot 应用程序中提供 JSP
- java - LongSummaryStatistics 为什么要实现 IntConsumer?
- ios - SSL 操作因代码而失败,同时向 ios 设备发送推送通知
- java - 尝试 WSO2 IoT 3.3.0 android 注册时如何修复错误“注册失败”?
- javascript - 多文档事务不使用 MongoDB Atlas