为什么这个函数会创建一个无限循环?

时间:2016-11-22 23:53:13

标签: python function python-3.x loops

为什么这会产生无限循环?如果它没有创建一个,为什么程序会冻结?不像IDLE停止响应,它就像我创建一个无限循环一样停止,它唯一做的就是输入()。试试代码看看我的意思。 (另请告诉我,评论中的for是否正确)

Accounts = {}
def create_account(x,y,z,a):
     global Accounts
     Checked = False
     while Checked == False:
        if x in Accounts:
            print("Sorry, that name has already been taken")
            print("Please choose a new name")
            x = input()
        for dictionary in Accounts:
            for key in dictionary:
                if a in key:
                    print("Sorry, password is invalid or not avalible")
                    print("Please choose a new password")
                    a = input()
     Accounts[x] = {"Proggress":y,"Points":z,"Pass":a}
     print(Accounts[x])

3 个答案:

答案 0 :(得分:1)

您的代码会创建一个无限循环,因为没有什么可以阻止它。

while checked == False会完全听到它的声音,它会一遍又一遍地遍历代码,直到checked = Truebreak

break将停止循环,允许程序完成。

checked = True也会停止循环

答案 1 :(得分:0)

我认为你要做的是这样的: 此代码未经测试

Accounts = {}
def create_account(x,y,z,a):
     global Accounts
     Checked = False
     while Checked == False:
        if x in Accounts:
            print("Sorry, that name has already been taken")
            print("Please choose a new name")
            x = input()
        else:
            passwordOk = True
            for dictionary in Accounts:
                for key in dictionary:
                    if a in key:
                        passwordOk = False
                        break
                if not passwordOk:
                    break
            if not passwordOk:
                print("Sorry, password is invalid or not avalible")
                print("Please choose a new password")
                a = input()
            else:
                Checked = True # this is the important part that you missed
    Accounts[x] = {"Proggress":y,"Points":z,"Pass":a}
    print(Accounts[x])

只是为了让您知道,您的代码可以进行优化。我尝试通过修改尽可能少的代码来解决您的问题,以便您能够理解问题

答案 2 :(得分:0)

造成这种情况有两个问题。

正如你所说,

  

print()在input()之前,而print永远不会输出,所以它没有那么远

但是,让我们退后一步:打印语句在块{ "codes" : [ { "coupon_id" : "584559bd1f65d363bd5d25fd", "value" : [ "FLAT30" ] }, { "coupon_id" : "58455a5c1f65d363bd5d2600", "value" : [ "FLAT30", "FLAT50" ], }, { "coupon_id" : "584878eb0005202c64b0cc5d", "value" : [ "FLAT30", "FLAT50", "FLAT70" ] } ] } 内。在第一行,您将if x in Accounts:设置为空字典(Accounts),因此无论Accounts = {}是什么,此时x永远不会为真 - 里面没有没有

现在,您确实有一行将项目添加到x in Accounts

Accounts

然而,正如其他人所指出的那样,你永远不会到达这里 - 它在循环之外,并且循环永不退出,因为Accounts[x] = {"Proggress":y,"Points":z,"Pass":a} 永远不会设置为Checked,也不会是True 1}}被叫。

您的程序基本上只是执行相同的几个步骤,而不执行任何操作:

  1. break吗?是的,继续循环。
  2. Checked == False?不,跳过这个街区。
  3. 对于x in Accounts中的每个dictionary,请执行一些操作,但Accounts为空,因此我无需执行任何操作。
  4. Accounts吗?是的,继续循环。