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 它没有递归调用。确保您了解 break
和 continue
的工作原理,因为您可能会发现它们很有用。
就个人而言,您的主要问题是 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()
在密码功能中,我试图让用户输入密码,如果 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 它没有递归调用。确保您了解 break
和 continue
的工作原理,因为您可能会发现它们很有用。
就个人而言,您的主要问题是 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()