python 連鎖比較はJavaScriptと何が違う?

要点

  • 3 > 2 > 1 はPythonではTrue、JavaScriptではfalseになりました。(出典: 自社の実測(2026-10-26))
  • 比較した3組のうち、答えが分かれたのはこの1組です。残りの2組は偶然一致しました。(出典: 自社の実測(2026-10-26))
  • Pythonでも、括弧で区切った (3 > 2) > 1 はFalseになりました。(出典: 自社の実測(2026-10-26))
  • JavaScriptでは、最初の比較で得たtrueを次の比較に使います。(出典: 自社の実測(2026-10-26))

同じ比較式なのに、どこで答えが変わるのか

3 > 2 > 1 を「3は2より大きく、2は1より大きい」と読むなら、条件は成立します。Pythonでは、この読み方に対応する結果が得られます。しかし、同じ式をJavaScriptに持ち込むと、結果はfalseになりました。

Pythonの連鎖比較とは、a > b > c を、隣り合う値の比較を論理積でつないだ意味として扱う文法規則です。今回の式なら、3 > 2 and 2 > 1 と同じ意味になります。

ここで問題になるのは、比較演算子を連続して書いた式の解釈です。Pythonで使っていた式をそのままJavaScriptに移しても、隣り合う値同士を比較する意味が保たれるとは限りません。

今回の実測は、2026-10-26にPython 3.9.0とNode.js v22.23.4で行いました。比較したのは、大小関係が異なる3組の式です。このうち答えが分かれたのは 3 > 2 > 1 だけで、残りの2組は一致しました。結果が一致する例もあるため、1つの式で同じ答えが出たことだけを根拠に、両言語が同じ規則で比較しているとは判断できません。

(出典: 自社の実測(2026-10-26))

公式資料は連鎖比較をどう説明しているか

Python公式リファレンスの「6.10. Comparisons」には、比較を連鎖できることと、x < y <= z が x < y and y <= z と同じ意味になることが説明されています。

この説明の要点は、連続した比較を、隣り合う値同士の比較とその論理積として読むことです。今回扱う 3 > 2 > 1 も、「まず比較結果を作り、その結果を1と比べる」という意味ではなく、3 > 2 and 2 > 1 と同じ意味で解釈されます。

出典: Python公式リファレンス「6.10. Comparisons」

一方、JavaScriptについて、MDNの「Greater than operator」では、比較演算子を左結合の2項演算子として評価すると説明されています。JavaScriptの式を読むときには、最初の比較で生じた真偽値が、次の比較の対象になる点を押さえる必要があります。

出典: MDN「Greater than operator」

Python公式資料の説明には等号を含む例もありますが、今回の実測には等号混在の検証は含まれていません。資料に記載された説明と、手元で実行して確認した範囲は区別します。

(出典: 自社の実測(2026-10-26))

3組の実測結果を比べる

実行したPythonのコードと結果は次のとおりです。

print(3 > 2 > 1)  # True
print(1 < 2 < 3)  # True
print(5 > 3 > 4)  # False

JavaScriptでも、同じ3組の式を実行しました。

console.log(3 > 2 > 1); // false
console.log(1 < 2 < 3); // true
console.log(5 > 3 > 4); // false

結果を並べると、違いが出た式を確認できます。真偽値の表記は、それぞれの実行結果に合わせています。

比較式 Python JavaScript 結果の一致
3 > 2 > 1 True false 不一致
1 < 2 < 3 True true 一致
5 > 3 > 4 False false 一致

3組のうち、答えが分かれたのは 3 > 2 > 1 だけです。 1 < 2 < 3 と 5 > 3 > 4 は偶然同じ答えになりましたが、式の解釈まで一致しているわけではありません。

(出典: 自社の実測(2026-10-26))

JavaScriptでは最初の比較結果を次の比較に使う

差が出た式について、JavaScript側では評価を分けて確認しました。

console.log(3 > 2);        // true
console.log(true > 1);     // false(true は数値の1として扱われ、1 > 1 は false)

JavaScriptは 3 > 2 > 1 を左から順に2項演算として評価します。最初の 3 > 2 で得られるのはtrueです。続く比較は 2 > 1 ではなく、true > 1 になります。

このときtrueは数値の1に変換されるため、実質的には 1 > 1 を判定します。1は1より大きくないので、結果はfalseです。

この流れを追うと、最初の比較が成立していても、式全体がfalseになる理由を説明できます。「3は2より大きく、2は1より大きい」という2条件を評価した結果ではありません。最初の比較から得た真偽値を、最後の値と比較した結果です。

後半の2組でPythonとJavaScriptの答えが一致したことも、この評価規則の違いを打ち消しません。今回確認できたのは、異なる解釈のもとで、3組中1組は答えが分かれ、2組は答えが一致したということです。

(出典: 自社の実測(2026-10-26))

Pythonでも括弧を付けると結果が変わる

Pythonが連鎖比較を特別な文法規則で解釈していることは、括弧を付けた式との比較でも確認できます。

print(3 > 2 > 1)       # True
print((3 > 2) > 1)     # False

括弧付きの式について、実測記録には次の出力があります。

>>> (3 > 2) > 1
False

括弧なしの 3 > 2 > 1 はTrueだったため、括弧の追加によって結果が逆になりました。

連鎖比較として書いた式は、3 > 2 and 2 > 1 と同じ意味で解釈されます。一方、(3 > 2) > 1 は、括弧内の比較結果を次の比較に使う形です。この例では、括弧は単に読みやすくするための区切りではなく、式の解釈を変えています。

Pythonで連鎖比較が使えることと、比較結果を次の比較に渡す式が同じ意味になることは別です。括弧の有無で結果が変わった点が、今回の確認事項の1つです。

(出典: 自社の実測(2026-10-26))

Goでは同じ書き方がコンパイルエラーになる

Goでも、次の書き方を確認しました。

a, b, c := 3, 2, 1
fmt.Println(a > b > c)

結果はコンパイルエラーでした。

./fchain2.go:5:22: invalid operation: a > b > c (mismatched types untyped bool and int)

この式では、a > b の結果である真偽値と、整数の c を比較しようとして型が合わなくなります。PythonやJavaScriptのように式を実行して真偽値を得る前に、コンパイル時点で止まります。

今回の例では、Pythonは連鎖比較としてTrueを返し、JavaScriptは左から順に比較してfalseを返しました。Goは真偽値と整数の比較を認めず、コンパイルエラーになります。同じ見た目の式でも、言語によって扱いが異なります。

(出典: 自社の実測(2026-10-26))

範囲判定では比較を明示的につなぐ

Pythonで隣り合う値の大小関係を続けて判定したいなら、連鎖比較の意味に沿って式を読めます。一方、JavaScriptやGoで同じ条件を表す場合は、a > b && b > c のように、比較を2つ書いて論理演算子でつなぎます。

値が両端の間にあるかを判定する場合も、JavaScriptやGoでは次の形で条件を表します。

a < x && x < b

これは「aがxより小さい」と「xがbより小さい」という2つの条件を明示した書き方です。Pythonの連鎖比較に慣れていても、JavaScriptやGoへ式を移すときには、その言語で同じ条件をどう表すかを確認する必要があります。

今回の食い違いは、Pythonの連鎖比較という文法規則と、JavaScriptの2項演算を連続して評価する規則の違いによるものです。比較結果が一致する例だけでなく、どの値とどの値を比較しているのかを見ることが、式の意味を確かめる手がかりになります。

出典: Python公式リファレンス「Comparisons」、MDN「Greater than operator」、自社の実測(2026-10-26)

自分の環境で確かめる手順

まず、使っているPythonとNode.jsの版を確認します。

python3 --version
node --version

今回の実測環境は、Python 3.9.0とNode.js v22.23.4でした。

(出典: 自社の実測(2026-10-26))

続いて、同じ3組の式を実行します。Python側には括弧付きの式も加えると、連鎖比較との結果の違いを確認できます。以下は読者が実行するためのコマンドです。

python3 -c 'print(3 > 2 > 1); print(1 < 2 < 3); print(5 > 3 > 4); print((3 > 2) > 1)'
node -e 'console.log(3 > 2 > 1); console.log(1 < 2 < 3); console.log(5 > 3 > 4); console.log(3 > 2); console.log(true > 1);'

出力はコマンド内の式の順に対応させて読みます。Pythonでは括弧の有無、JavaScriptでは最初の比較とその結果を使った比較に注目すると、答えだけを見比べる場合より、式の解釈の違いを確認しやすくなります。

なお、今回測ったのは3つの値を使う比較です。4つ以上の値を連鎖させた a > b > c > d や、等号を混ぜた a >= b > c は測っていません。掲載した表と出力は、ここで示した式と実測環境で確認した結果です。

(出典: 自社の実測(2026-10-26))

コメント

タイトルとURLをコピーしました