Python 中小谈global 全局变量

本文深入探讨Python中全局变量的使用,特别是在函数内的引用与修改。通过实例对比,讲解全局变量与局部变量的区别,以及如何正确使用'global'关键字。特别关注列表作为全局变量时的行为差异。

全局变量标志:global

工作中碰见了global全局变量,发现自己不太明白,在这记下来。。。

a = 1

def fun1():
	a = 2
	print("In fun1 a is:{}".format(a))

def fun2():
	global a
	a = 2
	print("In fun2 a is:{}".format(a))

if __name__ == '__main__':
	print("Before fun1 a is:{}".format(a))
	fun1()
	print("Now a is:{}".format(a))
	fun2()
	print("After fun2 a is:{}".format(a))

结果为

Before fun1 a is:1
In fun1 a is:2
Now a is:1
In fun2 a is:2
After fun2 a is:2

可以看出在fun1虽然在内部修改了a,但是此时a只是一个局部变量,全局变量a的值依旧为1。

但是

当在fun2中给a加了“global”标签后 再对a进行修改赋值,此时全局变量a就发生了改变。

当全局变量为一个数组时:

a = [1,2,3]

def fun1():
	a[1] = 1 
	print("In fun1 a is:{}".format(a))


def fun2():
	global a
	a[1] = 3 
	print("In fun2 a is:{}".format(a))

def fun3():
	a = [1,2]
	print("In fun1 a is:{}".format(a))



if __name__ == '__main__':
	print("Before fun1 a is:{}".format(a))
	fun1()
	print("Now a is:{}".format(a))
	fun2()
	print("After fun2 a is:{}".format(a))
	fun3()
	print("After fun3 a is:{}".format(a))

此时的结果为:

Before fun1 a is:[1, 2, 3]
In fun1 a is:[1, 1, 3]
Now a is:[1, 1, 3]
In fun2 a is:[1, 3, 3]
After fun2 a is:[1, 3, 3]
In fun1 a is:[1, 2]
After fun3 a is:[1, 3, 3]

哟,这个结果就有点神奇了

fun1引用全局变量并修改其中的元素时,虽然没有加global标签,但是a的值却变了!!!

fun2的a(加了global标签)表现平平,没有波澜~~~

fun1表现突出的原因在这里就不说了(个人猜测与python数据的内存引用有关)

结论:

  1. 想要引用但不修改全局变量,不需要加global标签;
  2. 想要修改全局变量时,需要加global标签;
  3. 例外:当变量是列表或元组时,若只修改元素的值,不需要加global标签就可直接修改

参考:https://www.cnblogs.com/yanfengt/p/6305542.html

<think>嗯,用户现在询问的是Pythonglobal关键字用法,重点在确认它是否用于定义全局变量。结合用户前面提到过的“globalCPFSU”(虽然CPFSU的具体含义未明,但可以聚焦当前问题),我需要根据最新提供的Python引用内容来解答。用户给的引用内容都很明确:引用[1][2]直接说明global用于在函数内部修改全局变量,引用[3][4]强调了变量作用域规则,引用[5]的示例则展示了全局列表的内存地址不变性。这说明用户需要的是准确的技术解释而非猜测性内容。注意到用户特别关注“定义”和“修改”的区别,这点很关键。从专业角度看,Pythonglobal实际是作用域声明指令而非定义操作——它不创建变量只绑定已有变量。引用[2]的示例最能说明这点:函数内部globalx只是将局部x关联到外部x,真正的变量定义在函数外。另外用户可能隐含深层疑问:为什么需要global而不是直接用外部变量?这就要解释Python的LEGB作用域规则(根据引用[3][4]),函数内部默认不能修改全局层变量。用引用[5]的可变类型示例会更直观——当变量是列表时,即便不用global也能修改元素(引用[5]展示的test02情况很说明问题),但重新赋值就需要global。最终框架会分三块:基本用法(区分定义/声明)、必要场景说明、可变对象特例。尤其要强调“修改=赋值操作”这个易错点——很多初级错误源于误解赋值和原地操作的区别。引用[5]的test01和test02函数对比恰好能形象解释这个概念。</think> 在 Python 中,`global`关键字**不用于定义全局变量**,而是用于声明函数内部对**已有全局变量的修改权限**。以下是核心解析: --- ### 一、`global`的核心用途 #### 1. **声明全局变量修改权** - 当函数内部需要修改**函数外部定义的全局变量**时,必须用`global`声明该变量。 - *未声明时*:函数内部对变量赋值会创建新**局部变量**,而非修改全局变量(可能导致逻辑错误[^4])。 *示例代码(错误示范):* ```python x = 10 # 全局变量 def func(): x = 20 # 创建局部变量x,而非修改全局x func() print(x) # 输出: 10(全局x未被修改) ``` #### 2. **正确修改全局变量的步骤** ```python x = 10 # 全局变量定义在函数外部 def modify_global(): global x # 声明x为全局变量 x = 20 # 修改全局x modify_global() print(x) # 输出: 20 [^2][^5] ``` - **`global x`仅声明权限**,全局变量本身需在函数外定义。 --- ### 二、关键场景与规则 #### 1. **修改不可变对象必用`global`** - 若全局变量为**不可变对象**(如整数、字符串),函数内部修改必须使用`global`: ```python count = 0 def increment(): global count count += 1 # 修改整数需声明 ``` #### 2. **可变对象的特殊规则** - 若全局变量为**可变对象**(如列表、字典),直接修改其内容(如`append()`)**无需**`global`: ```python test_list = [1, 2] # 全局列表 def modify_list(): test_list.append(3) # 无需global,直接操作元素 modify_list() print(test_list) # 输出: [1, 2, 3] [^5] ``` - 但若对可变对象**重新赋值**(如`test_list = [4, 5]`),仍需`global`声明。 --- ### 三、总结与最佳实践 | **场景** | 是否需`global` | 说明 | |-------------------------|---------------|-----------------------------| | 读取全局变量 | ❌ 不需要 | 函数可直接访问 | | 修改不可变全局变量 | ✔️ 必需 | 如`int`, `str`, `tuple` | | 修改可变全局变量的内容 | ❌ 不需要 | 如`list.append()`, `dict.update()` | | 对可变全局变量重新赋值 | ✔️ 必需 | 如`list = [新列表]` | > **最佳实践**: > 1. 避免滥用全局变量,优先用函数参数和返回值传递数据[^3]; > 2. 必须修改全局变量时,用`global`显式声明提高代码可读性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值