電子書籍の厳選無料作品が豊富!

素朴な疑問です。

pythonは動的言語としては型に厳しくて 2 + "1" なんて書くと
エラーになります。しかし

True == 1 == 1.0 は True
hash(True), hash(1), hash(1.0) は全て 1
True + 1 は 2

なのは有名な話です。

これを知らずに問題が起こることはほとんどないと思いますが
True, 1, 1.0 はハッシュのキーとしては重複扱いになり
気味悪いです。
なんでこんな実装にしたのでしょう?

A 回答 (3件)

True==1と1=1.0は別の理由と思います。


前者はboolをintのサブクラスとした仕様のためでしょう。完全に別物とすることもできるはずですが、C実装からの流れですかね。
後者は数としての自然な埋め込みなので妥当と思います。この型を区別するとスクリプト言語としてかなり扱いにくくなるでしょう。

Pythonというとオブジェクトの型はしっかりしていますが、変数には型がないのですよね。アノテーションはあっても碌にチェックされないし、アノテーションの文法が頻繁に変わって使いにくい。
せめて記法は早いところ安定してほしい。
    • good
    • 0

それくらいの緩い言語仕様が便利と持って作ったか、細かな部分を詰めずに作った結果がそうなのか・・・でしょう。


OSやデータベース管理システムといった基本ソフトウェアや大規模な基幹系の業務システムを作る言語ではなく、コンピューターを情報整理や分析の道具として使う研究者などが思いついたことをパパッとプログラムにでき、他の人が書いたプログラムソースの理解も容易で自分のプログラムに取り込むなどして徐々に大きなシステムにしていきやすい・・・といった取り回しのしやすさ重視して出来た言語のようですから、それくらいの緩さが逆に便利なのだと思います。

参考まで。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>それくらいの緩い言語仕様が便利と持って作ったか、
>細かな部分を詰めずに作った結果がそうなのか

私はそうは思いません。Javascriptなどはゆるゆるで、
時々思いもよらぬ型変換動きに悩まされることが有りますが
pythonは比較的型に厳格だと思います。
基本暗黙の型変換は整数型から浮動小数点型など
常識的なもの以外行いませんから・・・

ただ、 bool 型に関しては、浮いているというか、
少々不思議な仕様になっていると思います。

1 == 1.0 や hash(1) == hash(1.0) は一つの考え方だなと
一応納得はしているのですが

bool が int のサブクラスで

1 == True
hash(1) == hash(True)
isInstance(True, int)

が全て True なのには流石に違和感が有ります。

なんでこんなクラス構成にしたのでしょう?

解って使っていれば困らないのですが、気色悪いです。

お礼日時:2023/09/29 08:56

元々大規模なシステム開発向けではなく、スクリプト用の言語だったという理由があります。


その点ではJavaScriptに似ています。

後に型定義やアノテーションが加わって曖昧さを抑える工夫をしてますが、根本的な解決とは言えないでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!