1. ホーム
  2. python

[解決済み] Pythonで「0, 0 == (0, 0)」が「(0, False)」となるのはなぜか?

2022-09-02 17:02:45

疑問点

Pythonの場合(Python 3.6で確認しましたが、それ以前のバージョンでも同じように動作するはずです)。

(0, 0) == 0, 0   # results in a two element tuple: (False, 0)
0, 0 == (0, 0)   # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True

しかし

a = 0, 0
b = (0, 0)
a == b # results in a boolean True

なぜ2つのアプローチで結果が異なるのでしょうか?等号演算子はタプルの扱いが違うのでしょうか?

どのように解決するのですか?

最初の2つの式は両方ともタプルとしてパースされます。

  1. (0, 0) == 0 (これは False ) が続き、その後に 0
  2. 0 の後に 0 == (0, 0) (これはまだ False のような感じです)。

式がこのように分割されるのは、カンマ区切りと等号演算子の相対的な優先順位が異なるからです。Pythonは2つのタプル間の等値性テストではなく、2つの式を含むタプルを、そのうちの1つがたまたま等値性テストであると見なします。

しかし、2つ目のステートメントのセットでは a = 0, 0 はできません はタプルであるべきです。タプルは値の集まりであり、等号テストとは異なり、代入はPythonでは値を持ちません。代入は式ではなく、ステートメントです。タプルや他の周囲の式に含めることができる値を持ちません。もしあなたが以下のようなことを試したなら (a = 0), 0 のように、タプルとして強制的に解釈しようとすると、シンタックスエラーが発生します。タプルの変数への代入を残す - これは次のように書くことでより明示的にすることができます。 a = (0, 0) - の唯一の有効な解釈として a = 0, 0 .

ということで、括弧がなくても、代入先の a への割り当てに括弧がなくても、それと b に値が割り当てられます。 (0,0) というように a == b は、したがって True .