python中全局变量与局部变量

python中全局变量与局部变量

标签: python


  • 局部变量就是定义在一个函数体内部的变量
  • 全局变量是定义在外面的变量

比如:

a = 1
def f():
    b = 2

其中a就是全局变量,而b是局部变量。局部变量只在函数体内部有效,出了函数体,外面是访问不到的,而全局变量则对下面的代码都有效。

在函数体内部使用全局变量

全局变量可以直接在函数体内容部使用的,你可以直接访问,但是注意的是,如果对于不可变类型的数据,如果在函数里面进行了赋值操作,则对外面的全局变量不产生影响,因为相当于新建了一个局部变量,只是名字和全局一样,而对于可变类型,如果使用赋值语句,同样对外部不产生影响,但是使用方法的话就会对外部产生影响。

如下面的代码:

g_b = 3;g_l1 = [1,2];g_l2 = [1,2,3]
def t1():
    g_b = 2
    g_l1 =[]
    g_l2.append(7)
t1(g_b,g_l1,g_l2)
print(g_b,g_l1,g_l2)

global关键字

上面说到,如果使用的是赋值语句,在函数内部相当于新建了一个变量,并且重新给了指向,但是有时候我们想把这个变量就是外部的那个全局变量,在赋值操作的时候,就是对全局变量给了重新的指向,这个时候可以通过global关键字表示我在函数里面的这个变量是使用的全局那个。使用方法如下:

g_b = 3
def t1():
    global g_b
    g_b = 2
t1()
print(g_b)

这个时候你会发现全局变量g_b也重新指向了,这是因为global gb表示指定了函数中的g_b就是外面的那个。

<think>好的,我需要回答用户关于Python全局变量局部变量区别的问题。用户已经提供了一些参考资料,我需要结合这些资料,并且参考之前的对话内容来组织回答。首先,用户之前的提问是关于类中能否使用外部变量,现在转向全局变量局部变量的区别。我需要确保回答覆盖两者的定义、作用域、访问规则以及使用时的注意事项。同时,用户提供的引用内容提到了global关键字的作用、全局变量局部变量的使用场景,以及作用域的访问规则,这些都需要整合到回答中。接下来,我需要确定结构。通常,这样的问题适合分点回答,明确区别,可能包括定义、作用域范围、生命周期、修改方式等。此外,用户之前的回答中使用了表格总结,可能这次也可以用类似的方式,但需要根据当前问题调整内容。然后,要考虑用户可能的疑惑点,比如变量覆盖、修改全局变量的方法、嵌套作用域的处理等。引用中提到的在函数内部定义全局变量使用global关键字,以及局部变量的优先访问规则,这些都需要详细说明。还要注意引用标记的正确使用,确保每个引用的内容都对应正确的来源。例如,关于global关键字的作用来自引用[1],修改全局变量需要显式声明来自引用[4],函数参数作为局部变量的例子来自引用[4]等。另外,用户可能希望了解如何避免全局变量被意外修改,这在之前的回答中也有涉及,可以结合最佳实践来建议。同时,生成的相关问题需要主题紧密相关,比如作用域规则、global和非local关键字的区别、变量覆盖等。最后,确保使用中文回答,数学公式和代码块格式正确,引用标识自然添加,并生成相关问题。检查是否有遗漏的关键点,比如可变对象不可变对象在修改时的不同行为,或者闭包中的变量作用域问题,但这些可能超出当前问题范围,需根据资料决定是否包含。</think>### Python全局变量局部变量的核心区别 #### **1. 定义作用域** | 维度 | 全局变量 | 局部变量 | |--------------|------------------------------|------------------------------| | **定义位置** | 函数/类外部定义 | 函数/类内部定义 | | **作用范围** | 整个模块(跨函数访问) | 仅在定义它的函数/代码块内有效 | | **生命周期** | 随模块加载创建,程序结束销毁 | 随函数调用创建,返回后销毁 | **示例**: ```python global_var = 100 # 全局变量[^5] def test(): local_var = 200 # 局部变量 print(global_var) # 可读取全局变量[^4] test() # print(local_var) # 报错:NameError ``` --- #### **2. 访问修改规则** - **全局变量访问**: - 函数内可直接读取全局变量:`print(global_var)` - **修改需显式声明**:使用`global`关键字[^1][^3] ```python counter = 0 def increment(): global counter # 声明使用全局变量 counter += 1 # 允许修改[^4] ``` - **局部变量特性**: - 函数参数和内部定义的变量均为局部变量 - **同名变量优先访问局部作用域**: ```python x = 10 def func(x): # 参数x是局部变量 print(x) # 优先访问局部x[^4] func(20) # 输出20 ``` --- #### **3. 关键差异对比** | 场景 | 全局变量 | 局部变量 | |--------------------|------------------------------|------------------------------| | 跨函数数据共享 | ✅ 直接实现 | ❌ 需通过参数传递 | | 内存占用 | 长期占用内存 | 临时创建,节省内存 | | 代码可维护性 | 易引发意外修改,维护困难[^2] | 作用域隔离,更安全 | | 修改方式 | 需`global`声明 | 直接赋值 | --- #### **4. 嵌套作用域的特殊情况** 在闭包或嵌套函数中,使用`nonlocal`可访问外层非全局变量: ```python def outer(): outer_var = "Python" def inner(): nonlocal outer_var # 声明访问外层变量 outer_var = "Java" inner() print(outer_var) # 输出: Java ``` --- ### **最佳实践建议** 1. **优先使用局部变量**:减少副作用,提高代码健壮性[^2] 2. **全局变量命名规范化**:如`GLOBAL_COUNTER`,提醒开发者谨慎修改 3. **避免直接修改全局变量**:通过函数返回值或类封装管理状态 4. **注意可变对象修改**: ```python global_list = [] def append_item(item): global_list.append(item) # 修改可变对象无需global声明[^3] ``` --- ### **常见问题解析** **Q1: 为何修改列表不需要`global`声明?** A1: 列表是可变对象,对其元素修改不改变变量指向的内存地址,因此不被视为"重新赋值"[^3] **Q2: 全局变量类属性的区别?** A2: 类属性通过`ClassName.attr`访问,具有命名空间隔离;全局变量直接暴露在模块作用域 --- ### 数学表达示例 局部变量的作用域可表示为: $$ \text{Scope}_{\text{local}} = \{ x \mid x \in \text{Function} \} $$ 而全局变量的作用域满足: $$ \text{Scope}_{\text{global}} = \text{Module} \setminus \bigcup \text{Scope}_{\text{local}} $$ ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值