global用于在‌函数内部‌声明变量引用的是‌模块级全局变量‌,而非局部变量

它只影响变量在当前作用域内的绑定方式

不能创建真正的全局变量‌(跨文件的全局变量不存在)

总结:函数内部使用,引用模块级全局变量,在当前文件访问,而不是所有文件都可以访问

使用情况 

# 不使用global时
collection = None

def 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 = None

def setup():
    global collection
    collection = ...  # 修改file1的全局变量

# file2.py
from file1 import collection

def 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 = None

def 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_collection

init_db()  # 应用启动时初始化

def get_settings():
    return get_collection().find_one({})  # 安全访问 此处可以不用,符合读取全局变量

6 额外知识点 

Python按照Local→Enclosing→Global→Built-in的顺序查找变量 

  1. ‌L(Local) - 局部作用域‌
    指当前函数或方法内部定义的变量,仅在函数执行期间存在。例如:def func(): x = 10 # 局部变量 print(x)

  2. ‌E(Enclosing) - 嵌套作用域‌
    适用于嵌套函数结构,内部函数可以访问外部函数的变量。例如:

    def outer(): y = 20 # 外部函数变量                                                                      def inner(): print(y) # 访问外部函数变量 inner()

  3. ‌G(Global) - 全局作用域‌
    模块级别定义的变量,整个.py文件内有效。例如:

    z = 30 # 全局变量                                        def func(): print(z) # 访问全局变量

  4. ‌B(Built-in) - 内置作用域‌
    Python内置的命名空间(如print/len等)。当其他作用域找不到变量时,最后会查找这里。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐