Python中“(1,)== 1”是什么意思?


119

我正在测试元组结构,当我==像这样使用运算符时发现它很奇怪:

>>>  (1,) == 1,
Out: (False,)

当我将这两个表达式分配给变量时,结果为true:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

在我看来,这个问题与Python元组尾随逗号语法规则不同。请问==运算符之间的表达式组。


16
回顾OP仅在2个小时前提出一个问题,似乎很奇怪(或奇怪),如何仅以不同的方式提出问题框架会导致不同的结果(并得到社区的认可)。
AKS

24
@AKS这些是不同的问题
kmaork '16

7
@AKS虽然这里的问题略有不同,但我完全同意你的观点。牛群效应又称为HNQ。
疯狂的

5
@PythonNewHand确实,这是完全可以接受的。这就是为什么我以不同的方式提出这个问题
AKS

3
@CiroSantilli巴拿马文件六四事件法轮功 我浏览了这些答案,却发现没有什么东西可以解决这种特殊情况。
丹·盖茨

Answers:


88

其他答案已经向您显示该行为是由于运算符的优先级所致,如此处所述

下次您遇到类似问题时,我将向您展示如何找到答案。您可以使用以下ast模块来解构表达式的解析方式:

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

从中我们可以看到代码已按照Tim Peters的解释进行了解析:

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])

1
另一个有用的工具是dis-在这种情况下,您会看到两个LOAD_CONST具有不同的值((1,)1)和一个BUILD_TUPLEopp代码。
mgilson

153

这只是运算符的优先级。你的第一个

(1,) == 1,

像这样的团体:

((1,) == 1),

因此,根据将一个元素的元组1,与整数1进行相等性比较的结果来构建一个具有单个元素的元组False,


61
不是真的,但是1元组的语法很奇怪。一般而言,例如,如果1+2, 2==3, 4*7没有分组为,您会惊讶得多(1+2), (2==3), (4*7)。在实践中,几乎没有使用过1元组(好在StackOverflow问题;-之外)。
蒂姆·彼得斯

6
也许“意外”会比“奇怪”更好。我感觉好像我正在查看其中一幅图纸,根据您的视角和焦点,它们可能是两件事。与逗号相比,相等运算符是如此之大,因此很容易集中精力并假设结果为True/ False。现在,我了解正在发生的事情,这是完全显而易见和合理的。
skrrgwasme,2016年

31
现在您知道“ Python禅”的含义,说一种明显的方式“除非您是荷兰人,否则一开始可能并不明显” ;-)
Tim Peters

7
当您阅读文档并看到构成元组的是逗号而不是括号时,这有点令人困惑!因此,在此语句中,右手逗号不视为测试的一部分,但视为分隔符!意外的行为!
Ikra_5 '16

3
关于表达式的常见建议是“如有疑问,请使用括号”。之后,最好将括号括在所有一个元组中,即使它们不是元组语法的一部分。
nigel222 '16

12

当你做

>>> (1,) == 1,

它通过将元 (1,)整数进行比较并返回来生成一个元组False

相反,当您分配变量时,两个相等的元组会相互比较。

你可以试试:

>>> x = 1,
>>> x
(1,)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.