[解決済み】Pythonは強型付けされていますか?
質問
Pythonは強い型付け言語であるというリンクに出会いました。
しかし、強い型付け言語では、このようなことはできないのでは?
bob = 1
bob = "bob"
強く型付けされた言語は、実行時の型変換を受け付けないのでは?もしかしたら、強型・弱型の定義が間違っている(あるいは単純化しすぎている)のかもしれませんね。
では、Pythonは強型付け言語なのか弱型付け言語なのか?
どのように解決するのか?
Pythonは強く、動的に型付けされます。
- 強い の型付けは、値の型が予期せぬ方法で変化しないことを意味します。Perlで起こりうるように、数字だけを含む文字列が魔法のように数字になることはない。型が変わるたびに、明示的な変換が必要になります。
- ダイナミック 型付けとは、変数に型がある静的な型付けとは対照的に、実行時のオブジェクト(値)に型があることを意味します。
あなたの例では
bob = 1
bob = "bob"
これは、変数に型がなく、任意のオブジェクトの名前を付けることができるためです。その後
bob=1
を見ると
type(bob)
を返します。
int
しかし、その後に
bob="bob"
を返します。
str
. (ただし
type
は通常の関数なので、引数を評価し、その値の型を返します)。
これは古いC言語の方言とは対照的で、弱く静的な型付けがされており、ポインタと整数はほとんど交換可能でした。(現代のISO Cは多くの場合変換が必要ですが、私のコンパイラはデフォルトでこの点についてはまだ甘いです)。
強い型付けと弱い型付けは、二者択一というより連続的なものであることを付け加えておかなければなりません。C++はCよりも型付けが強い(より多くの変換が必要)ですが、ポインタのキャストを使用することで型システムを覆すことができます。
Pythonのような動的言語における型システムの強さは、そのプリミティブとライブラリ関数が異なる型にどう対応するかによって決まる。例えば
+
は、2つの数値に対して動作するようにオーバーロードされています。
または
文字列と数値の組み合わせではありません。これは
+
は実装されましたが、言語のセマンティクスに従った必然性はあまりありません。実際
+
を使えば、暗黙のうちに何でも数値に変換してくれます。
def to_number(x):
"""Try to convert function argument to float-type object."""
try:
return float(x)
except (TypeError, ValueError):
return 0
class Foo:
def __init__(self, number):
self.number = number
def __add__(self, other):
return self.number + to_number(other)
クラスのインスタンス
Foo
は、他のオブジェクトに追加することができます。
>>> a = Foo(42)
>>> a + "1"
43.0
>>> a + Foo
42
>>> a + 1
43.0
>>> a + None
42
Pythonは強型であっても、型のオブジェクトを追加することは全く問題ありません。
int
と
float
という型のオブジェクトを返します。
float
(例,
int(42) + float(1)
が返されます。
43.0
). 一方、以下のようにすると、型の不一致のため、Haskellは文句を言うでしょう。
(42 :: Integer) + (1 :: Float)
. このため、Haskellは厳密に型付けされた言語であり、型は完全に分離され、型クラスを介して制御された形でしかオーバーロードを行うことができないのです。
関連
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] 弱型付け言語に関する明らかな矛盾の解明を求めて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonを使ったオフィス自動化コード例
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] typing.Dictとdictの定義の違い?
-
[解決済み] 数字を切り上げるには?
-
[解決済み】動的型言語と静的型言語の比較
-
[解決済み] 弱型付け言語に関する明らかな矛盾の解明を求めて