循环中的变量会改变值

3

我昨天开始学习Python编程,所以我是一个新手!

我有这个函数,它必须检查:

  1. 插入的值是否为数字
  2. 数字是否不大于31(请参见下面的代码)

在调试过程中,我发现了这个我不理解的错误:

  1. 我故意选择了一个大于31的数字,例如45
  2. 它再次提示我,我选择了一个正确的数字,例如7
  3. 在代码中,我要求打印voto变量两次(在注释中称为“POINT A”和“POINT B”)
  4. 输出结果如下:

    7

    45

然后我又被要求输入一个不同的数字。

我不明白为什么变量的值会在while循环刚开始后立即改变。

请您使用非常简单的话向我解释一下,谢谢!(<- 请记住我是一个初学者!:D)

提前感谢您!

def controlla_voto(voto_lett):
    flag=1
    while flag:
        for y in voto_lett:
            if (ord(y) in range(48,58))==0:
                voto_lett=raw_input("Invalid charachters, try again: ")
                flag=1
                break
            else: flag=0
    voto=int(voto_lett)
    print voto   # POINT A
    while (voto in range(32))==0:
       print voto #POINT B
       voto_lett=raw_input("Invalid number, try again: ")
       controlla_voto(voto_lett)
    return voto

2
(ord(y) in range(48,58))==0?你是不是想说 not isdigit(y) - Fred Foo
2
请修复粘贴程序中的缩进;否则我们将无法理解它。 - Antonis Christofides
1
我已经修正了缩进,对此感到抱歉! - user2669155
@larsmans:是的,我想我是这个意思,但我不知道isdigit(我也不知道not...) - user2669155
@user2669155 请展示你的代码的其余部分,即如何调用该函数。 - Antonis Christofides
显示剩余6条评论
1个回答

2

太完美了!你只是在递归调用中忘记了return。

def controlla_voto(voto_lett):
flag=1
while flag:
    for y in voto_lett:
        if (ord(y) in range(48,58))==0:
            voto_lett=raw_input("Invalid charachters, try again: ")
            flag=1
            break
        else: flag=0
voto=int(voto_lett)
print voto   # POINT A
while (voto in range(32))==0:
    print voto #POINT B
    voto_lett=raw_input("Invalid number, try again: ")
    return controlla_voto(voto_lett)
return voto

另一种解决方案是:
voto = controlla_voto(voto_lett)

但是需要一些东西来跳出while循环。


1
@user2669155 因为你必须返回调用所给出的结果。如果不这样做,要么会返回None(如果没有遇到return语句),要么会返回一个可能是旧值的不同结果。 - glglgl
1
谢谢Jim为这个问题投票!我肯定会为答案投票,只要请继续解释直到我理解为止... :-$ - user2669155
1
好的,这里是发生的事情:整数voto在下面的while循环中永远不会改变,所以唯一的方法是有一个返回。如果没有返回,controlla_voto(第二个)就会完成,你会被困在那个循环中。而且voto仍然是31以上的某个值。 - Jiminion
1
每次调用函数时都会创建一个voto的新副本。因此,当函数结束(没有返回值)时,该上下文也随之结束,并且旧值回到了处理的那个级别。递归很棘手,它与复制和粘贴代码不同,因为调用具有新的上下文。 - Jiminion
1
@Antonis Christofides:你的评论并不是很建设性:D。虽然我是个初学者,但要么你给我列出我应该先搞清楚什么,要么就没什么帮助了。我使用递归函数是因为我需要递归函数。 - user2669155
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接