Python在布尔表达式中使用多个运算符 背景

Python在布尔表达式中使用多个运算符 背景,python,if-statement,controls,boolean-logic,boolean-expression,Python,If Statement,Controls,Boolean Logic,Boolean Expression,众所周知,我们最好不要像a=b=[1,2,3]那样假设几个变量使用chain赋值,因为a将是b的一个较低副本。这是不安全的,因为当我们修改b时,a会改变 但是,如果初始化是不可变的,我们可以这样做,而且是安全的 最近,我在控制流的条件表达式中发现了多个运算符的奇怪用法,例如if 1

众所周知,我们最好不要像
a=b=[1,2,3]
那样假设几个变量使用
chain赋值
,因为
a
将是
b
的一个较低副本。这是不安全的,因为当我们修改
b
时,
a
会改变

但是,如果初始化是不可变的,我们可以这样做,而且是安全的

最近,我在控制流的条件表达式中发现了多个运算符的奇怪用法,例如
if 1
,而a==b==c==1:

例如,以下控制流在不同条件下执行不同的块:

a = 1
b = 1
c = 2

if a == b == c == 1:
    print('All equal!')
else:
    print('At least one variable is not equal to others')

至少有一个变量不等于其他变量


我的问题 这在控制流中的布尔表达式中是安全的吗?我知道我们在编写布尔表达式时应该检查还有什么我们需要注意的吗?我尝试了一会儿,我认为多操作员使用是安全的


字节码分析 我键入以下程序的字节码:

a = 1;b =2;c =1.5
a<b<c
import dis
dis.dis('a<b<c')
a=1;b=2;c=1.5

a这是您给出的代码

a = 1
b = 1
c = 2

if a == b == c == 1:
    print('All equal!')
else:
    print('At least one variable is not equal to others')
让我们理解它的含义。
a==b==c==1
仅当三个值都等于
1
时,才计算为
True
。否则计算为
False
a==b==c
被评估为
a==b和b==c和c==a

为了得到你想要的,你必须这样做

if a==b==c==1:
    print('All are equal')
elif (a==b) or (b==c) or (c==a):
   print('At least one variable is not equal to others')
else:
    print('none of them are equal')
现在来分析您提供的第二个bytcode

a = 1;b =2;c =1.5
a<b<c
6如果跳到第14行,则跳到第14行,如果跳到第14行,则跳到第14行。
在逻辑
中,False和任何布尔值
总是计算为
False

现在,如果
6跳转\u如果\u FALSE\u或\u POP 14
True
,则它将继续执行
8
14


在一个表达式中使用多个布尔运算符是安全的。

0
8
它比较
a
,在
10
检查它的
False
,如果是转到
18
,旋转堆栈,弹出顶部值,即
False
,因为
a您的问题不清楚。比较和赋值是两种不同的操作。比较没有与赋值相同的问题。我知道如何使用
assgnment
。我对此毫无疑问。我想知道的是,在控制流中的
布尔表达式中使用多个操作是否安全?@Travis是的,它是安全的。您可以编写
多个布尔表达式
a = 1;b =2;c =1.5
a<b<c
In [2]: a=1;b=2;c=1.5

In [3]: dis.dis('a<b and b<c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_TRUE_OR_POP     14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE