Pythonの「(1、)== 1」の意味は何ですか?


119

私はタプル構造をテストしていますが、次の==ような演算子を使用すると奇妙なことがわかりました。

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

これら2つの式を変数に割り当てると、結果はtrueになります。

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

この質問は、私の見解では、Pythonタプルの末尾のコンマ構文規則とは異なります。==演算子間の表現のグループを尋ねます。


16
ちょうど2時間前のOPによる前の質問を見ると、質問のフレーミングがどのように異なると、さまざまな結果(およびコミュニティ間での受け入れ)につながるかは素晴らしい(または奇妙です)ようです。
AKS 2016年

24
@AKSこれらは異なる質問です
kmaork

7
@AKS質問はここでは少し異なりますが、私はあなたの主張に完全に同意します。群れ効果、別名HNQ。
非常識

5
@PythonNewHand確かに、それは完全に受け入れ可能です。そのため、質問のフレーミングを別の方法で追加しました。
AKS 2016年

3
@CiroSantilli巴撤馬文件六四事件法轮功どのように考えますか?私はそれらの答えをすくい取り、この特定の状況をカバーするように見えるものは何も見ませんでした。
Dan Getz 2016年

回答:


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値が異なる2つ((1,)および1)とBUILD_TUPLEopp-codeが表示されます。
mgilson 2016年

153

これは単なる演算子の優先順位です。初めての

(1,) == 1,

そのようなグループ:

((1,) == 1),

そのため、1つの要素のタプル1,1等しいかどうかを整数と比較した結果から、単一の要素を持つタプルを作成します。これらは等しくないFalse,ため、結果の1タプルを取得します。


61
実際にはそうではありませんが、1タプルの構文は奇妙です。一般的には、例えば、はるかに多くの場合は驚かれると思い、1+2, 2==3, 4*7やっていないとしてグループ(1+2), (2==3), (4*7)。実際には、1タプルはほとんど使用されません(まあ、StackOverflowの質問以外では;-))。
ティムピーターズ2016年

6
おそらく、「奇妙な」よりも「予期しない」の方が適切な言葉でした。私は、あなたの視点と焦点に応じて、2つのことになる可能性があるこれらの図面の1つを見ているような気がします。等号演算子はコンマに比べて非常に大きいので、それに集中して、結果がTrue/ であると想定するのは簡単Falseです。何が起こっているのか理解したので、それは完全に明白で合理的です。
skrrgwasme 2016年

31
そして今、あなたは;-)それを行うための1つの明らかな方法は、と言って何を「禅のPythonの」手段「最初は明らかではないかもしれませんしない限り、あなたがしているオランダ語を」知っている
ティム・ピーターズ

7
ドキュメントを読んで、タプルを構成するものが括弧ではなくコンマであることがわかると、少し混乱します!したがって、このステートメントでは、右側のコンマはテストの一部とは見なされませんが、セパレーターと見なされます。予期しない動作!
Ikra_5 2016年

3
式に関する一般的なアドバイスは、「疑問がある場合は括弧を使用する」です。その後は、タプル構文の一部ではありませんが、すべての1タプルを括弧で囲むことをお勧めします。
nigel222 2016年

12

あなたがするとき

>>> (1,) == 1,

それは比較の結果タプル構築タプルを (1,)有する整数、したがって戻りをFalse

代わりに、変数に割り当てると、2つの等しいタプルが互いに比較されます。

あなたが試すことができます:

>>> x = 1,
>>> x
(1,)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.