所以在python中,可以很容易地检查真值条件,并且用括号它可以优先考虑真实条件的顺序,例如:这些都很容易理解:
>>> 3 > 2
True
>>> (3 > 2) is True
True
但是这些意味着什么,我无法理解他们为什么返回False / True的逻辑:
>>> 3 > 2 is True
False
>>> 3 > (2 is True)
True
>>> 5 < 3 is False > 2 is True
False
>>> 5 < 3 is False is True > 2 is True
False
>>> 3 < 5 is True is True > 2 is True
False
>>> 3 < 5 is True is True > 2 is True is not False is True
False
>>> 3 < 5 is True is (True > 2 is True is not False) is True
False
>>> 3 < 5 is True is (True > (2 is True) is not False) is True
False
>>> (3 < 5 is True is True) > 2 is (True is not False is True)
False
我知道这些不是pythonic条件,但我应该如何理解它们?它是否仍然是从左到右?
或者is True
或/和is False
是否会占据主导地位?
答案 0 :(得分:3)
您可以使用dis
模块分析每个案例,以确切了解发生了什么。例如:
In [1]: import dis
In [2]: def test():
...: return 3 > 2 is True
...:
In [3]: dis.dis(test)
2 0 LOAD_CONST 1 (3)
3 LOAD_CONST 2 (2)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 4 (>)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_GLOBAL 0 (True)
17 COMPARE_OP 8 (is)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
这意味着每个步骤后堆栈看起来像这样:
0: 3
3: 3 2
6: 3 2 2
7: 2 3 2
8: 2 True
11: 2
14: 2 True
17: False (comparison was: "2 is True")
20: (False is returned)
对我来说,老实说,它看起来像Python中的一个错误。也许有一个很好的解释为什么会发生这种情况,但我会在上游报告。
只是以相同的方式重写它,代码确实:
if 3 > 2:
if 2 is True:
return True
return False
编辑:也许它实际上会产生一些奇怪的感觉。考虑如何检查链式不等式:
3 > 2 > 1 == 3 > 2 and 2 > 1
如果它概括为:
x op1 y op2 z == x op1 y and y op2 z
可以解释结果。
Edit2:这实际上与文档匹配。看看链式比较:https://docs.python.org/2/reference/expressions.html#not-in
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
is
被视为与>
一样好的比较,因此应用了多重比较的标准扩展。
现在应该清楚其他比较。所需的唯一奇怪的新细节是:True == 1
,False == 0
,3 > False
中的3 > (2 is True)
。其他大多数都可以用扩展来解释。例如:
5 < 3 is False > 2 is True == False
(5 < 3) and (3 is False) and (False > 2) and (2 is True) == False
答案 1 :(得分:2)
varchar(50)
类型是nvarchar(max)
的子类型。因此Boolean
实际为1而int
为0。
Python中的所有比较操作都具有相同的优先级(True
,False
,>
,<
,>=
,<=
,{ {1}},==
)。
比较可以任意链接,例如,
!=
等同于is [not]
,除了y仅被评估一次(但在两种情况下,当[not] in
是y时,根本不评估z发现是假的。)正式地,如果
x < y <= z
,x < y and y <= z
,x < y
,...,a
,b
是表达式,c
,{{ 1}},...,y
是比较运算符,然后z
等同于op1
,除了每个表达式最多只计算一次。
答案 2 :(得分:1)
首先,你需要一个小的备忘单才能知道order of evaluation。大多数这些运算符位于同一个括号中,因此从左到右进行评估。有了这些知识,这些例子就可以转化为它们的“真实”含义:
(3 < 5 is True is True) > 2 is (True is not False is True)
相当于:(实际上没有__is__
和__not__
,因为这些是无法重载的关键字。这只是为了说明目的)
(3.__lt__(5).__is__(True).__is__(True)).__gt__(2).__is__(True.__is__(False).__not__().__is__(True))
我可能会遗漏一些描述here的细节。好处是你(希望)从来没有写过这样复杂的表达式,你需要检查文档以了解它的作用。
编辑:没关系,通过比较这种方式不起作用。比较得到“一对一对”的比较,就像viraptor的回答中所述。