Pythonでは、変数を定義したい場合は、CやJavaなどの他の言語とは異なり、変数の型を指定する必要はありません。変数の型と名前と代入の理解
どのようにして、Pythonインタプリタは変数を区別し、int
やfloat
のようにメモリに必要なスペースを与えることができますか?
Pythonでは、変数を定義したい場合は、CやJavaなどの他の言語とは異なり、変数の型を指定する必要はありません。変数の型と名前と代入の理解
どのようにして、Pythonインタプリタは変数を区別し、int
やfloat
のようにメモリに必要なスペースを与えることができますか?
Pythonでは、すべての値は組み込み型の情報を持つオブジェクトです。変数はこれらの値への参照です。したがって、そのタイプは「ダイナミック」であり、特定の瞬間に参照するタイプのタイプに等しいだけです(ポイントを参照)。
変数の内容にメモリが割り当てられるたびに、値が使用可能になります。それはタイプを有するので、必要とされるメモリ量は既知である。
参照(変数)自体は、概念的なアドレスしか含んでいないので、それが何を指していても常に同じ量のメモリを占有します。
これは確かに、それはまだ特定の値を持っていないので
def f (x):
print (x)
Xは、型を持たないことを意味します。 これは非常に柔軟性があるという点です。 コンパイラにはエラーを検出する手段が限られているという欠点があります。 このため、最近Pythonにはtype hintsが追加されました。 mypyのようなツールでは、インタープリタが必要ない場合でも、静的な型検査を行うことができます。 しかし、プログラマは、特にモジュール境界(API)で、チームで働いているときに、時にはそうです。
Pythonは動的に型指定された言語です。つまり、実行時に変数の型が決定されます。その結果、Pythonインタプリタは実行時の変数の型を区別し、必要なメモリ内の正確な領域を与えます。動的に型付けされているにもかかわらず、Pythonは強く型付けされており、明確に定義されていない操作(たとえば、文字列に数値を追加するなど)を禁止します。
一方、CおよびC++は静的型付き言語であり、コンパイル時に変数の型がわかっています。プログラミング言語における動的型付けを使用して
は、例えば、我々は(例えば文字と整数を含むリスト)さまざまな種類のリストを持つことができ、言語へのより多くの潜在与え利点があります。リストの型はコンパイル時から知っているはずなので、これは静的な型付けでは不可能です...)。
動的タイピングの欠点の1つは、多くの場合、コンパイラインタープリタは変数のタイプを抽出するために型のレコードを保持する必要があるため、CやC++と比較して処理速度が遅くなることです。
pythonのような動的型指定言語も強く型付けできます。インタプリタはすべての変数型を追跡し、型の混在を制限するため、Pythonは厳密に型指定されています。
動的に型指定された言語は、通常、実行時の型情報を含むボックス化された表現を使用します。例えば。値への直接ポインタを格納する代わりに、システムは、値(またはそれへのポインタ)といくつかの追加のメタ情報を含むボックス構造体を使用します。あなたは彼がここにそれをしない標準のPython実装方法を見ることができます。https://github.com/python/cpython/blob/master/Include/object.h
ここで使用することができますいくつかの興味深いトリックがあります。例えば、1つの手法は値のタグ付けであり、タイプ記述は値自体の一部として未使用バイトを利用して格納されます。たとえば、現在のx86-64 CPU上のポインタは、完全なアドレス空間を利用することができません。このテクニックのもう一つの変種はNaNタグ付けです(私はこれがLuaJITの作者、Mike Pallによって最初に使われたと信じています)。すべての値が倍精度として格納され、値シグナルのさまざまなNaN状態は、データの種類。
Pythonインタプリタは、プログラム実行時に各変数を分析します。実行する前に、変数に整数、浮動小数点数、または文字列があるかどうかはわかりません。
静的にタイプされた言語の背景(私の場合はJava)を使用している場合は、少し珍しいことです。動的な型指定は、大規模なスクリプトで多くの時間とコード行を節約します。変数を定義するのを忘れてしまったので、エラーが発生するのを防ぎます。ただし、静的な型指定により、データをコンピュータのメモリに格納する方法をより詳細に制御できます。
これはPythonに固有のものではなく、動的に型指定された言語*にも適用されます。 – deceze
誰があなたに 'PHP'であなたに変数のタイプを定義する必要があると言ったのですか? –
変数に割り当てられたオブジェクトは_variable_に必要なメモリには影響しません。オブジェクト自体は変数とは異なります。 – khelwood