前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3——unboundlocalerror报错原因

python3——unboundlocalerror报错原因

作者头像
全栈程序员站长
发布2022-09-13 08:13:59
2890
发布2022-09-13 08:13:59
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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

报错原因

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

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

基本类型

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

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

代码语言:javascript
复制
two = 0
def add_two():
    two = 2
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

此时程序很和谐,函数内部为本地变量,函数外部为外部变量。

有赋初值,也有其他操作

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

代码语言:javascript
复制
two = 0
def add_two():
    two += 2
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

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

非基本类别

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

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

代码语言:javascript
复制
two = [1,2]
def add_two():
    two.append(3)
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

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

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

代码语言:javascript
复制
two = [1,2]
def add_two():
    two = [1,2,3]
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

没有其他操作:因为函数内有赋值操作,此时程序认为two为本地变量。

代码语言:javascript
复制
two = [1,2]
def add_two():
    two = [1,2,3]
    two.append(4)
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

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

其他操作在赋值操作前

代码语言:javascript
复制
two = [1,2]
def add_two():
    two.append(4)
    two = [1,2,56]
    print(two)
add_two()
print(two)
这里写图片描述
这里写图片描述

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149056.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 报错原因
  • 基本类型
    • 只有赋初值,没有其他操作
      • 有赋初值,也有其他操作
      • 非基本类别
        • 没有赋初值操作,有其他操作
          • 只有赋初值,不管有没有其他操作
            • 其他操作在赋值操作前
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档