enena 发表于 2020-7-9 18:30:18

except然后又重新调用函数,出现异常

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 18:35:53

完整报错内容?

Twilight6 发表于 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()

永恒的蓝色梦想 发表于 2020-7-9 19:07:48

Twilight6 发表于 2020-7-9 18:38
你需要重新声明下变量,因为递归过程会产生屏蔽效果:

这和屏蔽没啥关系吧……

Twilight6 发表于 2020-7-9 19:08:52

永恒的蓝色梦想 发表于 2020-7-9 19:07
这和屏蔽没啥关系吧……

递归了 就像内嵌函数,当你 float 那边报错了 导致 if 条件的 float_a 没有定义

永恒的蓝色梦想 发表于 2020-7-9 19:10:17

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

和我想说的一样,但这不叫屏蔽啊{:10_277:}
只能是 int_a 没定义吧,int 都过了,float 还过不了吗?{:10_312:}

Twilight6 发表于 2020-7-9 19:12:03

永恒的蓝色梦想 发表于 2020-7-9 19:10
和我想说的一样,但这不叫屏蔽啊
只能是 int_a 没定义吧,int 都过了,float 还过不了吗 ...


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

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


永恒的蓝色梦想 发表于 2020-7-9 19:12:54

Twilight6 发表于 2020-7-9 19:12
开始递归之前的变量相对于递归中的变量是全局变量

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

他这里根本没有全局变量啊{:10_312:}int_input 除外

Twilight6 发表于 2020-7-9 19:14:12

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


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

主函数内部的内嵌函数外部的参数 ,相对于内嵌函数来说不就是全局变量了

永恒的蓝色梦想 发表于 2020-7-9 19:18:59

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

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

那好吧{:10_312:}

Stubborn 发表于 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并没有被定义

Twilight6 发表于 2020-7-9 19:29:07

Stubborn 发表于 2020-7-9 19:22
程序设计问题啦。




{:10_250:} 我认为我的没错

Stubborn 发表于 2020-7-9 19:32:48

Twilight6 发表于 2020-7-9 19:29
我认为我的没错

int_a = int(a)这里引发错误,所以这里int_a是没有定义的。在后面使用肯定会报错的。



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

Twilight6 发表于 2020-7-9 19:39:27

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

哦我懂你意思了

enena 发表于 2020-7-9 20:21:24

所以应该把 int_a 和 float_a 的判断放到 try: 那里
即使 int_a 没有被定义,也不会被执行到!!
感谢大佬们

Stubborn 发表于 2020-7-9 21:21:29

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

实际上float_a 不用定义,int_a如果没有定义到,必定会报错。下面的判断就是多余的
页: [1]
查看完整版本: except然后又重新调用函数,出现异常