python3——unboundlocalerror报错原因

本文详细解释了在函数内部使用外部变量时可能遇到的错误及其原因,包括基本类型和非基本类型的变量处理区别,并提供了具体的代码示例来说明如何避免这类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现此错误,一般是因为,在调用的函数内,使用了外部变量造成的。这里先姑且不管你的目的是什么(可能是你想对这个外部变量进行一些赋值操作;也可能是你只是想创建一个本地变量,但是你不小心弄成和外部变量重名了)

报错原因

0.首先必须假设你没有在调用函数内部开头使用global External _variable#外部变量或者nonlocal External _variable#外部变量(因为使用了这两条语句,程序就只会认为External _variable为外部变量,也就不可能会报错了)
1.在调用函数内部,对这个外部变量进行赋值,那么此时程序认为你其实是在对一个与外部变量重名的本地变量进行赋值操作。
2.既然是对本地变量进行赋值操作,那么其他操作(这些操作需要此本地变量已经赋过初值了)就必须在赋值操作语句以后出现。

3.但如果其他操作在赋值操作之前出现,那么程序报错。
4.还有一种特殊情况是External _variable += 2,因为它既是赋值操作(所以程序判定此变量为内部变量),也属于其他操作,因为它需要此变量赋过初值。这种情况出现也会报错。

函数内,不进行赋值操作,直接使用外部变量的引用时,是没有问题的,比如进行print操作。

基本类型

当这个外部变量的类别是基本类型(比如int,float,str等)。
函数内部的操作有如下几种情况:

只有赋初值,没有其他操作

two = 0
def add_two():
    two = 2
    print(two)
add_two()
print(two)

这里写图片描述
此时程序很和谐,函数内部为本地变量,函数外部为外部变量。

有赋初值,也有其他操作

且其他操作没有在赋初值操作之后出现。

two = 0
def add_two():
    two += 2
    print(two)
add_two()
print(two)

这里写图片描述
此时程序认为two为本地变量,但two连初值都没有,就让人家进行+=操作,那肯定会报错。

非基本类别

当这个外部变量的类别是非基本类型(比如list,dict等)。
函数内部的操作有如下几种情况:

没有赋初值操作,有其他操作

two = [1,2]
def add_two():
    two.append(3)
    print(two)
add_two()
print(two)

这里写图片描述
打印结果可以看出,程序认为two为外部变量,所以执行完函数,外部变量也改变了。

只有赋初值,不管有没有其他操作

two = [1,2]
def add_two():
    two = [1,2,3]
    print(two)
add_two()
print(two)

这里写图片描述
没有其他操作:因为函数内有赋值操作,此时程序认为two为本地变量。

two = [1,2]
def add_two():
    two = [1,2,3]
    two.append(4)
    print(two)
add_two()
print(two)

这里写图片描述
有其他操作,且顺序是对的(即赋值操作在前):因为函数内有赋值操作,此时程序认为two为本地变量。无论你有多少其他操作,操作到的只是这个本地变量而已。

其他操作在赋值操作前

two = [1,2]
def add_two():
    two.append(4)
    two = [1,2,56]
    print(two)
add_two()
print(two)

这里写图片描述
有其他操作,且顺序是错的(即赋值操作在后面):因为函数内有赋值操作,此时程序认为two为本地变量。但顺序错了,所以报错。

### Python 中局部变量与全局变量的定义 #### 定义 在 Python 中,**局部变量**是指在函数内部定义并仅限于该函数作用域内的变量[^2]。而 **全局变量** 则是在函数外部定义的变量,其作用范围覆盖整个程序文件,只要函数调用发生在全局变量定义之后即可访问它[^3]。 --- ### 区别 1. **作用域** - 局部变量的作用域局限于定义它的函数内部,无法在函数外部或其他函数中使用。 - 全局变量在整个脚本范围内有效,可以在任意位置被读取或修改(前提是遵循特定规则)[^3]。 2. **生命周期** - 局部变量只存在于函数执行期间,当函数结束时会被销毁。 - 全局变量则会在整个程序运行过程中持续存在,直到程序终止[^3]。 3. **赋值与声明** - 如果希望在一个函数内为定义在函数外的变量重新赋值,则需要显式地通过 `global` 关键字声明此变量为全局变量[^1]。否则,默认情况下,Python 将视之为一个新的局部变量。 - 函数内部首次出现在等号右侧的未声明变量默认被认为是全局变量的一部分;但如果在同一表达式的左侧再次出现相同名称的新变量名,则会导致错误,因为此时解释器认为这是试图引用尚未初始化的本地副本[^3]。 --- ### 使用方法 以下是关于如何正确处理局部和全局变量的一些示例: #### 示例 1: 正确操作全局变量 如果要在函数内部更改已存在的全局变量值,需先利用 `global` 进行声明: ```python x = 10 # 全局变量 def modify_global(): global x # 告诉编译器我们正在使用的 'x' 是全局的那个 x += 5 modify_global() print(x) # 输出将是 15 ``` #### 示例 2: 错误尝试直接修改全局变量而不加声明 如果没有提前指定某个变量作为全局对象对待,那么即使同名也会创建新的局部实例而非影响原始数据结构: ```python y = 20 # 另一全局变量 def try_modify_without_global(): y *= 2 # 这里实际上创建了一个名为'y'的新局部变量而不是更新原有的那个 # 导致 UnboundLocalError 报错,除非加上 global y try_modify_without_global() # 上述代码会抛出异常:"UnboundLocalError" ``` #### 示例 3: 避免混淆的情况——安全引用全局变量 可以通过简单地读取全局变量的内容来避免潜在冲突: ```python z = 30 def safely_use_global(): result = z * 3 # 不涉及重命名或者再分配给新实体的操作都是允许的 return result output = safely_use_global() print(output) # 成功打印90 ``` #### 示例 4: 结合局部与全局变量 有时可能既想保留原有全局状态又生成临时计算结果存入独立空间存储下来供后续单独处置: ```python w = 40 def combine_local_and_global(): local_w = w + 7 # 创建一个基于当前全局‘w’值得到增强版版本保存至local_w之中 return local_w new_value = combine_local_and_global() print(new_value) # 显示数值应等于47 print(w) # 而原初设定保持不变依旧显示为40 ``` --- ### 总结 理解并掌握好局部变量与全局变量的概念及其相互关系对于编写清晰高效的 python 应用至关重要。合理运用这些特性可以帮助开发者更好地管理复杂项目中的资源分布状况以及提升整体性能表现水平。 问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值