我不知道那里发生了什么。 这是如此简单,但我已经进行了很长时间的实验,这没有任何意义。
以下是代码:
var = int( input( 'Select "2" o "3" (Write your answer). ' ))
while var != 1 & var != 2:
var = int (input( 'Invalid. You have to write "2" or "3". ' ))
print('You select', var)
如果我用1 回答输入,它就可以正常工作了。但当我回答 2时,它进入循环。 最奇怪的部分是当我写 0时它不会进入循环!
有人知道可能发生的事情。 也许是一个 口译员问题......
这只是我的问题的减少,但我不能通过这种方式使用while循环!!
答案 0 :(得分:3)
&
和and
在Python中不是同一个运算符。
and
表示logical (aka boolean) and,你想要的那个 - 如果它的两个论点都是真实的那么它是真的。&
表示bitwise and - 它为两个参数中1
的每个位返回一个带1
的新数字(例如,5 & 3
,aka { {1}},0b101 & 0b011
,又名1
,0b001
是6 & 1
- 这是假的,即使两个参数都是真的,因为它们不是共享任何共同点)。那不是你想要的。最重要的是,他们有不同的operator precedence(请注意表中0
高于and
,但!=
低于此值,所以你&# 39;实际上做的是&
。自var != (1 & var) != 2
以来,无论1 != 2
恰好是什么,都是如此。
这里有两个不同的区别,但值得学习:
1 & var
短路:如果x and y
为假,则Python不会评估x
。这意味着您可以执行y
之类的操作,并知道它不会调用if x and x.spam()
并在None.spam()
为x
时引发异常。但None
只是一个普通的运算符,如&
,它总是计算两个参数。+
总是将值比较为boolean truthy-or-falsey;它不能被自定义类覆盖来执行自定义事务,但x and y
可以 - 例如,它表示如果值是集合则设置交集,或者按位元素并且如果它们是numpy数组等等则设置交集