python中global关键字的使用
global用于在函数内部声明变量引用的是模块级全局变量,而非局部变量
它只影响变量在当前作用域内的绑定方式
不能创建真正的全局变量(跨文件的全局变量不存在)
总结:函数内部使用,引用模块级全局变量,在当前文件访问,而不是所有文件都可以访问
使用情况
# 不使用global时
collection = Nonedef init_db():
# 创建的是局部变量,不会影响全局collection
collection = mongodb_init().client["mongo"]["dbsettings"]
init_db()
print(collection) # 输出 None (全局变量未被修改)
#使用global时
collection = None
def init_db(): global collection # 声明引用全局变量
collection = mongodb_init().client["mongo"]["dbsettings"]
init_db() print(collection) # 输出集合对象 (全局变量已被修改)
global的关键特性
1. 只在当前作用域有效
def outer_function():
global collection # 声明影响整个函数作用域
def inner_function():
global collection # 必须再次声明才能影响内部作用域
collection = ... # 修改全局变量
2. 只能修改模块级变量,不能创建跨模块变量
# file1.py
collection = Nonedef setup():
global collection
collection = ... # 修改file1的全局变量# file2.py
from file1 import collectiondef modify():
global collection # 声明的是file2的全局变量
collection = ... # 修改的是file2的collection副本
3. 对可变对象的特殊行为
collection = {"data": []} # 全局可变对象
def add_data(item):
# 不需要global声明来修改对象内容
collection["data"].append(item) # ✅ 直接修改
def replace_collection():
global collection # 需要global来重新绑定变量
collection = new_collection # 重新赋值
4 何时需要global何时可以不用
| 情境 | 是否需要global | 说明 |
|---|---|---|
| 读取全局变量 | ❌ 不需要 | 函数可以直接访问 |
| 修改可变对象内容 | ❌ 不需要 | 如dict.update(), list.append() |
| 重新绑定全局变量 | ✅ 需要 | 给变量赋新值 |
| 跨模块共享变量 | ❌ 不可能 | 通过导入/访问器实现 |
5 举例
# database.py
_client = None
_collection = Nonedef init_db(uri="mongodb://localhost:27017"):
global _client, _collection
_client = MongoClient(uri) #此处需要global,因为是重新绑定全局变量
_collection = _client["mongo"]["dbsettings"]def get_collection():
if not _collection: #此处可以不用,符合读取全局变量
raise RuntimeError("Database not initialized")
return _collection# app.py
from database import init_db, get_collectioninit_db() # 应用启动时初始化
def get_settings():
return get_collection().find_one({}) # 安全访问 此处可以不用,符合读取全局变量
6 额外知识点
Python按照Local→Enclosing→Global→Built-in的顺序查找变量
L(Local) - 局部作用域
指当前函数或方法内部定义的变量,仅在函数执行期间存在。例如:def func(): x = 10 # 局部变量 print(x)E(Enclosing) - 嵌套作用域
适用于嵌套函数结构,内部函数可以访问外部函数的变量。例如:
def outer(): y = 20 # 外部函数变量def inner(): print(y) # 访问外部函数变量 inner()G(Global) - 全局作用域
模块级别定义的变量,整个.py文件内有效。例如:
z = 30 # 全局变量 def func(): print(z) # 访问全局变量B(Built-in) - 内置作用域
Python内置的命名空间(如len等)。当其他作用域找不到变量时,最后会查找这里。
更多推荐



所有评论(0)