Why does (1 in [1,0] == True) evaluate to False?
当我看这个问题的答案时,我发现我不理解自己的答案。
我真的不明白这是怎么分析的。为什么第二个示例返回false?
1 2 3 4 5 6 7 8 9 10 11 12 13
| >>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File"<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable |
谢谢你的帮助。我想我一定错过了一些非常明显的东西。
我认为这与链接的副本稍有不同:
为什么表达式0<0==0在python中返回false?.
这两个问题都与人类对表达的理解有关。(在我看来)有两种方法来评价这个表达。当然,两者都不正确,但在我的例子中,最后的解释是不可能的。
从0 < 0 == 0的角度看,你可以想象每一半都被评估,并且作为一个表达式是有意义的:
1 2 3 4
| >>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True |
号
因此,链接回答了为什么评估False:
但是在我的例子中,1 in ([1,0] == True)作为一个表达式是没有意义的,因此,除了有两种(公认是错误的)可能的解释之外,似乎只有一种可能:
1
| >>> (1 in [1,0]) == True |
。
- 运算符优先级…==的结合比in更紧密,因此首先对[1,0] == True进行评估,然后将结果反馈给1 in other_result。
- 我已经删除了python-2.7标记,因为python 3.2的行为方式相同。
- @马克B:不解释第二个表达
- @马尔布,这个问题包括用括号来反驳这一解释的测验。
python实际上在这里应用比较运算符链接。表达式被转换为
1
| (1 in [1, 0]) and ([1, 0] == True) |
很明显是False。
这也适用于以下表达式
号
翻译成
(不评估b两次)。
有关详细信息,请参阅Python语言文档。
- 1 in [1, 0] == [1, 0]True评价
- 法国电力公司
- 我一直认为这是一种温和的语言。我想,算子比其他比较算子更优先,而且不太重要。但也许我错过了一个机会
- 尼斯摔跤,我甚至没想到这并不意味着给予in〔3〕在所有x < y < z之后,使人有意义,但对x in y in z却不那么重要。
- 斯蒂芬鲁姆巴尔斯基:一些像埃多克斯1,7,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4我可能会用一个变量
- @sven useful:maybe.Readable:definitely not.用此公约模拟通用数学印刷版的Python捕捉目标,但在使用in时,这很简单,不需要再拖延了。
- @Konradrudolph:I seen like"1≤x=87122;"在数学课文中,我不止一次,但我基本上同意你。
- @Stevenrumbalski,当我想说1 < x < 10时,已经有很多次了;和其他语言中的情况一样;比较链接在许多情况下都是合适的。没有学会其他编程语言的人自然会理解这种行为。主要的问题是,在你通常不使用比较椅子的情况下,实现这一特征变得模糊不清(例如在这个问题上)。第一个问题是,太多的行动是在一个不可剥夺的人身上发生的,而代码需要写成,以便进一步解释。
- 这听起来像你同意我。我只想免除链接的操作员是操作员。我对现状感到高兴。
- @Svenmarnach你怎么找到这个的?
- @Pkoch:我很熟悉Python语言,知道比较操作员链接。这不是太多秘密即使教学法也解释了我所要做的是双重检查,这也适用于in操作员,但这实际上是从问题中清晰无误的。另见我的邮件中的链接。
- @Svenmarnach我知道关于Chaining的事,但那不是明显的。你没有把心理比赛当作一个比较运算符。但是,寻找你长大Python的神奇方式,我来到了AST模块。它也有一些光芒。试试ast.dump(ast.parse('1 in [0,1] == True').body[0])和ast.dump(ast.parse('(1 in [0,1]) == True').body[0])
- 如你所说,为a < b < c翻译。如果声明像EDOCX1&18
- 只有一次进行评价时,才进行评价。自从逻辑上讲是结合的,我们不必担心进一步的括号。