Python 中的全局变量 global 和 globals()

本文介绍了Python中global关键字和globals()函数的区别与用法。


global用于在函数内部声明要修改的全局变量,而globals()返回包含所有全局变量的字典,可用于动态访问和修改全局变量。


文章通过示例展示了二者的基本用法、嵌套函数中的应用、动态操作全局变量的技巧,并对比了它们的特性和适用场景。


同时强调了避免过度使用全局变量的最佳实践,建议优先使用类和参数传递。


最后提供了检查变量是否存在、获取用户定义变量等高级技巧,帮助开发者合理使用全局变量。


Python 中的 globalglobals()


这两者都与 Python 的全局变量相关,但作用和使用方式不同。


一、global 关键字

作用

在函数内部声明要修改的变量是全局变量,而不是创建局部变量。

基本用法

python

python 复制代码
# 全局变量
x = 10
name = "Alice"

def func1():
    # 只读取全局变量,不需要 global
    print(x)  # 10

def func2():
    # 要修改全局变量,必须用 global
    global x
    x = 20  # 修改全局变量
    print(x)  # 20

def func3():
    # 不用 global,会创建局部变量
    x = 30  # 这是局部变量
    print(x)  # 30

func1()
func2()
func3()
print(x)  # 20(全局变量被修改为 20)

修改多个全局变量

python

python 复制代码
a = 1
b = 2
c = 3

def modify():
    global a, b, c  # 声明多个全局变量
    a = 10
    b = 20
    c = 30

modify()
print(a, b, c)  # 10 20 30

嵌套函数中使用

python

python 复制代码
count = 0

def outer():
    count = 100  # 局部变量
    
    def inner():
        global count  # 这指向最外层的全局变量,不是 outer 的 count
        count = 200
    
    inner()
    print("outer 中的 count:", count)  # 100(未被修改)
    print("全局 count:", globals()['count'])  # 200

outer()

二、globals() 函数

作用

返回当前全局符号表的字典,包含所有全局变量。

基本用法

python

python 复制代码
# 查看所有全局变量
print(globals())
# 输出类似:
# {'__name__': '__main__', '__doc__': None, ...}

# 访问全局变量
x = 100
name = "Python"

print(globals()['x'])     # 100
print(globals()['name'])  # Python

# 修改全局变量
globals()['x'] = 200
print(x)  # 200

# 添加新的全局变量
globals()['new_var'] = "Hello"
print(new_var)  # Hello

动态操作全局变量

python

python 复制代码
# 动态创建全局变量
var_names = ['a', 'b', 'c']
for i, name in enumerate(var_names):
    globals()[name] = i + 1

print(a, b, c)  # 1 2 3

# 动态修改变量
var_name = input("输入要修改的变量名: ")
new_value = input("输入新值: ")
if var_name in globals():
    globals()[var_name] = new_value

三、global vs globals()

对比表格

特性 global globals()
类型 关键字 函数
用途 声明要修改的全局变量 获取/修改全局变量字典
修改方式 直接赋值 字典操作
需要声明 需要先声明 不需要声明
代码可读性 更清晰 较隐晦

实际对比

python

python 复制代码
# 方式1:使用 global
counter = 0

def increment():
    global counter
    counter += 1

# 方式2:使用 globals()
def increment2():
    globals()['counter'] += 1

increment()
increment2()
print(counter)  # 2

四、常见应用场景

1. 配置管理

python

python 复制代码
# config.py 风格
DEBUG = True
VERSION = "1.0"

def set_debug(status):
    global DEBUG
    DEBUG = status

def set_version(version):
    globals()['VERSION'] = version  # 也可以用 globals()

2. 计数器

python

python 复制代码
call_count = 0

def track_calls():
    global call_count
    call_count += 1
    print(f"函数被调用了 {call_count} 次")

3. 动态导入

python

python 复制代码
# 动态创建模块级别的变量
module_name = "math"
globals()[module_name] = __import__(module_name)

print(math.sqrt(16))  # 4.0

五、注意事项和最佳实践

⚠️ 避免过度使用全局变量

python

python 复制代码
# ❌ 不好的做法:过度依赖全局变量
total = 0
def add(x):
    global total
    total += x

def subtract(x):
    global total
    total -= x

# ✅ 更好的做法:使用类和参数
class Calculator:
    def __init__(self):
        self.total = 0
    
    def add(self, x):
        self.total += x
    
    def subtract(self, x):
        self.total -= x

⚠️ 函数内的变量优先级

python

python 复制代码
x = 10

def test():
    x = 20          # 局部变量
    print(x)        # 20
    print(globals()['x'])  # 10

test()

⚠️ 可变对象不需要 global

python

python 复制代码
# 列表、字典等可变对象
my_list = [1, 2, 3]

def modify():
    # 修改列表内容不需要 global
    my_list.append(4)    # ✅ 可以
    my_list[0] = 10      # ✅ 可以
    
    # 但是重新赋值需要 global
    # my_list = [4, 5, 6]  # ❌ 这会创建局部变量

modify()
print(my_list)  # [10, 2, 3, 4]

六、高级技巧

检查变量是否存在

python

python 复制代码
if 'my_var' in globals():
    print(f"my_var = {my_var}")
else:
    print("my_var 不存在")

获取所有用户定义的全局变量

python

python 复制代码
def get_user_globals():
    return {k: v for k, v in globals().items() 
            if not k.startswith('__')}

x = 1
y = 2
print(get_user_globals())  # {'x': 1, 'y': 2}

临时修改全局变量

python

python 复制代码
DEBUG = True

def temp_disable_debug():
    old_debug = globals()['DEBUG']
    globals()['DEBUG'] = False
    # 执行某些操作...
    globals()['DEBUG'] = old_debug

总结

  • global:声明要修改的全局变量,代码清晰,推荐使用

  • globals():返回全局变量字典,适合动态操作

  • 最佳实践:尽量少用全局变量,考虑使用类、函数参数传递

  • 注意 :修改可变对象(列表、字典)的内容不需要 global

相关推荐
2401_835956812 小时前
Vue 3 中集成 Three.js 场景的完整实现指南
jvm·数据库·python
weixin_568996062 小时前
CSS移动端实现卡片悬浮投影_利用box-shadow设置层次感
jvm·数据库·python
Polar__Star2 小时前
Go语言怎么做自动补全_Go语言CLI自动补全教程【经典】
jvm·数据库·python
qq_424098562 小时前
CSS如何去掉数字输入框的默认微调按钮_利用---webkit-inner-spin-button
jvm·数据库·python
Full Stack Developme2 小时前
Hutool File 教程
linux·windows·python
weixin_458580122 小时前
HTML怎么提升首屏加载_HTML关键资源内联策略【说明】
jvm·数据库·python
郝学胜-神的一滴2 小时前
Python魔法函数深度探索|从工具实操到核心应用,解锁语言底层的优雅密码
开发语言·数据库·人工智能·python·pycharm
m0_640309302 小时前
MongoDB广告点击追踪如何建模_点击事件聚合与去重记录
jvm·数据库·python
m0_674294642 小时前
如何在 SciPy 中实现 NumPy 数组的重叠拼接与平均融合
jvm·数据库·python