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