Python は 1 == '1' が False になるみたいなので、他の言語の実装も見てみた話

JavaScript, PHP, Python

この記事は最終更新日から1年以上が経過しています。

Python は 1 == ‘1’ が False になる

はじめに

先日、次のようなコードを書いたところ思った通りに動きませんでした。

整数でも文字でも、勝手に Python が変換して比較してくれると思っていたのですが、
型が違うと False となってしまいました。

ちなみに、この二つは print 関数に渡すと全く同じ出力結果になります。
これが余計に分かりづらくしています。

これは(一番単純な方法だと)、以下のように書き換えることで正しく動きます。

Python は型を宣言が必要ない言語なのですが、ちゃんと型の比較をしているようです

入門書をぱらぱらと読んで分かったつもりになっていましたが、もしかしたらこのような勘違いがあるのではと思い
Phthon の比較周りについて、他の言語と比べつつまとめてみました。

あんまり分かっていない自分なりにまとめたものですので、
よくご存知の方にとっては当たりまえの内容になると思いますが。。。

環境

なぜか PHP7 ではなく PHP5 がインストールされてました。

他の言語との比較

Python は変数を作る際に型の宣言を行いません。
また、変数の型は実行時に自動的に変わります。

内部ではちゃんと型を持っています

これは、多くのスクリプト言語でも同じ事が言えます。
(私が辛うじて書くことの出来る、)JavaScript と PHP も型宣言はありません。

しかしながら、この二つの言語とPythonには違いがあります。
これらでは、私が最初にあげたようなコードがこちらの想定通りに動いてくれます。

JavaScript:

PHP:

JavaScript や PHP は、型が違っても緩く比較しています。
一定の規則で型を変換して比較を行っているのです。
PHPの公式マニュアルには代表的な変換例が掲載されています。

これは便利ですが、思いも寄らぬ結果を招くことがあります。
例えば、 PHP で以下のように書くと、空文字を検知しようとして余計な物まで検知してしまいます

そのため、この二つには厳密に型を比較する演算子(===)が用意されています。

JavaScript:

PHP:

ちなみに、Python にはこんな演算子はありません

ここまでのまとめ

  • Python は他のスクリプト言語に漏れず、動的型付き言語
    • つまり、変数を作ったり使ったりする際に型を意識する必要はそんなにない
  • だが、比較の際は型を厳格に区別して比較している
  • 一方、JavaScript や PHP は異なる型での比較が緩い
  • 他と比べると、Python のコードって短い

Python における False とは

さっきの PHP の例を Python で実行してみました。

なにも出力されませんでした。

そもそも、空文字は検知してくれるのでしょうか?

ちゃんとエラーメッセージを出してくれました。
空文字は False になるようです。

では、False となるのはどの様な時なのでしょうか?
先輩からお借りしている入門Python3で、「4.3.1 True とは何か」という節で詳しく述べられていました。
実際に、そこに書かれている物や他の言語だと False になっているものを並べて検証してみました。

数値の 0 が False になるのが恐いですね。
うっかり使って、想定外の動きをされそうです。

ちなみに、PHP だとこうなります。

意外と同じでした。

Python で「何もない」を表すには、=== ではなく is 演算子を用いるようです。
これで、「空っぽ」なのか「そもそもない」のかを区別して記述します。

これで、None 以外の全て物を弾くことができました。

ここまでのまとめ

  • Python も False との比較は暗黙的なキャストが行われる
  • 値の有無を確かめるには if val is None / if val is not None を用いる

まとめ

  • Python は他のスクリプト言語に漏れず、動的型付き言語
    • つまり、変数を作ったり使ったりする際に型を意識する必要はそんなにない
  • だが、比較の際は型を厳格に区別して比較している
  • 一方、JavaScript や PHP は異なる型での比較が緩い
  • Python も False との比較は暗黙的なキャストが行われる
  • 値の有無を確かめるには if val is None / if val is not None を用いる
  • 何が「等しい」かは言語によって結構異なる
    • 初めての言語ではちゃんと調べて使う

JavaScript, PHP, Python