鱼C论坛

 找回密码
 立即注册
查看: 1708|回复: 15

[已解决]except然后又重新调用函数,出现异常

[复制链接]
发表于 2020-7-9 18:30:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def int_input():
    a = input('请输入一个整数:')
    try:
        int_a = int(a)
        float_a = float(a)
    except ValueError:
        print('出错,您输入的不是一个整数!')
        int_input()
    if int_a != float_a:
        int_input()

为什么会出现UnboundLocalError.....


最佳答案
2020-7-9 19:22:36
本帖最后由 Stubborn 于 2020-7-9 19:23 编辑
Twilight6 发表于 2020-7-9 19:14
相对于叫做全局变量,触发的效果是一样的所以我这里也叫屏蔽了哈哈

主函数内部的内嵌函数外部的参数 ...


程序设计问题啦。
def int_input():
    a = input('请输入一个整数:')
    try:
        int_a = int(a)
        float_a = float(a)
    except ValueError:
        print('出错,您输入的不是一个整数!')
        int_input()
    if int_a != float_a:
        int_input()

以这个程序为例,,假设第一次调用,程序报错,被捕捉,进行第二次调用,程序不报错,正常走完流程,发回一个None。

此时,你还要走这部分的代码:    if int_a != float_a:注意这个标红的,由于你的报错是int(a)引发的,所以int_a并没有被定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-9 18:35:53 | 显示全部楼层
完整报错内容?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 18:38:11 | 显示全部楼层


你需要重新声明下变量,因为递归过程会产生屏蔽效果:
def int_input():
    global int_a,float_a
    a = input('请输入一个整数:')
    try:
        int_a = int(a)
        float_a = float(a)
    except ValueError:
        print('出错,您输入的不是一个整数!')
        int_input()
    if int_a != float_a:
        int_input()
int_input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:07:48 | 显示全部楼层
Twilight6 发表于 2020-7-9 18:38
你需要重新声明下变量,因为递归过程会产生屏蔽效果:

这和屏蔽没啥关系吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:08:52 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-9 19:07
这和屏蔽没啥关系吧……

递归了 就像内嵌函数,当你 float 那边报错了 导致 if 条件的 float_a 没有定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:10:17 | 显示全部楼层
Twilight6 发表于 2020-7-9 19:08
递归了 就像内嵌函数,当你 float 那边报错了 导致 if 条件的 float_a 没有定义

和我想说的一样,但这不叫屏蔽啊

只能是 int_a 没定义吧,int 都过了,float 还过不了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:12:03 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-9 19:10
和我想说的一样,但这不叫屏蔽啊

只能是 int_a 没定义吧,int 都过了,float 还过不了吗 ...



开始递归之前的变量相对于递归中的变量是全局变量

当你内部变量赋值和外部名相同时候,就会触发屏蔽机制呗


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:12:54 | 显示全部楼层
Twilight6 发表于 2020-7-9 19:12
开始递归之前的变量相对于递归中的变量是全局变量

当你内部变量赋值和外部名相同时候,就会触发屏 ...

他这里根本没有全局变量啊int_input 除外
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:14:12 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-9 19:12
他这里根本没有全局变量啊int_input 除外


相对于叫做全局变量,触发的效果是一样的所以我这里也叫屏蔽了哈哈

主函数内部的内嵌函数外部的参数 ,相对于内嵌函数来说不就是全局变量了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:18:59 | 显示全部楼层
Twilight6 发表于 2020-7-9 19:14
相对于叫做全局变量,触发的效果是一样的所以我这里也叫屏蔽了哈哈

主函数内部的内嵌函数外部的参数 ...

那好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:22:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2020-7-9 19:23 编辑
Twilight6 发表于 2020-7-9 19:14
相对于叫做全局变量,触发的效果是一样的所以我这里也叫屏蔽了哈哈

主函数内部的内嵌函数外部的参数 ...


程序设计问题啦。
def int_input():
    a = input('请输入一个整数:')
    try:
        int_a = int(a)
        float_a = float(a)
    except ValueError:
        print('出错,您输入的不是一个整数!')
        int_input()
    if int_a != float_a:
        int_input()

以这个程序为例,,假设第一次调用,程序报错,被捕捉,进行第二次调用,程序不报错,正常走完流程,发回一个None。

此时,你还要走这部分的代码:    if int_a != float_a:注意这个标红的,由于你的报错是int(a)引发的,所以int_a并没有被定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-9 19:29:07 | 显示全部楼层
Stubborn 发表于 2020-7-9 19:22
程序设计问题啦。

我认为我的没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:32:48 | 显示全部楼层


int_a = int(a)  这里引发错误,所以这里int_a是没有定义的。在后面使用肯定会报错的。
def int_input():
    a = input('请输入一个整数:')
    try:
        int_a  = int(a)
    except ValueError:
        print('出错,您输入的不是一个整数!')
        int_input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 19:39:27 | 显示全部楼层
Stubborn 发表于 2020-7-9 19:32
int_a = int(a)  这里引发错误,所以这里int_a是没有定义的。在后面使用肯定会报错的。

哦  我懂你意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 20:21:24 | 显示全部楼层
所以应该把 int_a 和 float_a 的判断放到 try: 那里
即使 int_a 没有被定义,也不会被执行到!!
感谢大佬们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 21:21:29 | 显示全部楼层
enena 发表于 2020-7-9 20:21
所以应该把 int_a 和 float_a 的判断放到 try: 那里
即使 int_a 没有被定义,也不会被执行到!!
感谢大 ...

实际上float_a 不用定义,int_a如果没有定义到,必定会报错。下面的判断就是多余的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 01:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表