while 循环中的 != 语句即使不应该返回 True - Python

The != statement in the while loop is returning True even when it shouldn't - Python

在密码功能中,我试图让用户输入密码,如果 he/she 输入了错误的密码,则再给他们一次输入正确密码的机会,或者干脆退出。 我面临的问题是,如果我输入了错误的密码,然后如果我再次使用 TRY AGAIN,那么即使我输入了正确的密码(即 1234),它仍然显示 INCORRECT PASSWORD!

为了检查哪里出了问题,我使用了 print(answer, type(answer))print(passwd, type(passwd)) 来查看它们是否真的完全相同(顺便说一句,它们是一样的)。我还使用 print(answer != passwd) 来查看这是否是导致问题的原因,确实如此。即使 answer 和 passwd 都相等,它也会返回 True。请建议我应该做什么。

passwd = '1234'


def password():
    global passwd
    answer = input("ENTER THE PASSWORD:\t")
    print(answer, type(answer))
    print(passwd, type(passwd))
    while answer != passwd:
        print(answer != passwd)
        print('INCORRECT PASSWORD!')
        print("1. TRY AGAIN.\n2. QUIT")
        ans = input("Answer(1/2):\t")
        while ans not in ['1', '2']:
            print("Incorrect input.")
            ans = input("Answer(1/2):\t")
        if ans == '1':
            password()
        elif ans == '2':
            print("Bye!")
            quit()

您必须包含 else 语句或答案 == passwd

passwd = '1234'


def password():
    global passwd
    answer = input("ENTER THE PASSWORD:\t")
    print(answer, type(answer))
    print(passwd, type(passwd))
    while answer != passwd:
        print(answer != passwd)
        print('INCORRECT PASSWORD!')
        print("1. TRY AGAIN.\n2. QUIT")
        ans = input("Answer(1/2):\t")
        while ans not in ['1', '2']:
            print("Incorrect input.")
            ans = input("Answer(1/2):\t")
        if ans == '1':
            password()
        elif ans == '2':
            print("Bye!")
            quit()
    else:
        print('correct')
        password()

并不意思是“回到函数的开始”。它的意思是“再次调用该函数,作为一个全新的动作;让它使用它自己的完全独立的局部变量集;弄清楚是什么已返回;然后 从此处 继续 returns"。

换句话说:这意味着 完全相同的事情 如果你调用 任何其他函数

当新的函数调用发生时,它会再次提示输入 input 并且你给它匹配的输入。这意味着 while 循环不会 运行,并且已到达函数的末尾 - 对于该调用。

然后它 returns 回到它在旧函数调用中的位置(就像调用任何其他函数时一样),没有效果本地 answer。所以现在 answer != passwd 因为之前 answer != passwd 并且两个值都没有改变。 passwd 是全局的,但 answer 是局部的 - 并且局部值对于 函数的调用是局部的。

你应该尝试重新思考你的逻辑,画一个流程图,然后 re-write 它没有递归调用。确保您了解 breakcontinue 的工作原理,因为您可能会发现它们很有用。

就个人而言,您的主要问题是 while 循环的使用顺序。我已经通过编辑您的代码并更改 while 循环和其他一些东西的顺序,设法解决了 password 函数的问题:

passwd = '1234'
def password():
    global passwd
    while True:
        answer = input("ENTER THE PASSWORD:\t")
        if answer != passwd:
          wrongAnswer = input("1. TRY AGAIN.\n2. QUIT\nAnswer(1/2):\t")
          while wrongAnswer != "1" and wrongAnswer != "2":
            print("Incorrect input.")
            wrongAnswer = input("Answer(1/2):\t")
          if wrongAnswer == "2":
            print("Bye!")
            break
        else:
          print("Password is correct! Goodby")
          break

示例输出

ENTER THE PASSWORD: 8765
1. TRY AGAIN.
2. QUIT
Answer(1/2):    1
ENTER THE PASSWORD: 8765
1. TRY AGAIN.
2. QUIT
Answer(1/2):    1
ENTER THE PASSWORD: 1234
Password is correct! Goodby
passwd = '1234'
# I added answer = None for the first function call
answer = None              


def password():
    global passwd
    # The global answer ensures I use whatever the latest value of answer is(defined by the return statement at teh end of function)
    global answer         
    answer = input("ENTER THE PASSWORD:\t")
    print(answer, type(answer))
    print(passwd, type(passwd))
    while answer != passwd:
        print(answer != passwd)
        print('INCORRECT PASSWORD!')
        print("1. TRY AGAIN.\n2. QUIT")
        ans = input("Answer(1/2):\t")
        while ans not in ['1', '2']:
            print("Incorrect input.")
            ans = input("Answer(1/2):\t")
        if ans == '1':
            password()
        elif ans == '2':
            print("Bye!")
            quit()
    # This would return the answer and change the global variable
    return answer          


password()