Python で型変換を行いたい場合は、組み込み関数を使用する必要があることはわかっていました。
例えば:
number = int('100')
しかし、私はC#スタイルを使用して次のような変換を行っています
number = (int)('100')
それも機能します。なぜそれが機能しているのか教えてください。
以下のコードを使用して同じことをしようとしても、うまくいきません。
number = (int)'100'
Python で型変換を行いたい場合は、組み込み関数を使用する必要があることはわかっていました。
例えば:
number = int('100')
しかし、私はC#スタイルを使用して次のような変換を行っています
number = (int)('100')
それも機能します。なぜそれが機能しているのか教えてください。
以下のコードを使用して同じことをしようとしても、うまくいきません。
number = (int)'100'
Python には「型変換」がありません。あなたはコンストラクターに渡し'100'ています。型を括弧で囲んでも値は変わりませんが、型の引数から括弧を削除すると、コンストラクター呼び出しではなく、構文エラーになります。int
関数の引数を指定する場合を除いて、(x)は と同じxであるため、(int)('100')と同等int('100')です。
それらは同じバイトコードにコンパイルされます:
>>> import dis
>>> dis.dis(lambda: int('100'))
1 0 LOAD_GLOBAL 0 (int)
3 LOAD_CONST 1 ('100')
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(lambda: (int)('100'))
1 0 LOAD_GLOBAL 0 (int)
3 LOAD_CONST 1 ('100')
6 CALL_FUNCTION 1
9 RETURN_VALUE
int('100')
これは、「 という名前のオブジェクトを見つけて、それを関数として呼び出し、引数としてint渡す」ことを意味します。'100'
(int)('100')
これは同じことを意味します。なぜなら、左側が と同じであるから(int)です。これは、 とint同じ理由で(3)と同じ3です。
(int)'100'
同じ原則により、これは と同じでint '100'、構文エラーです。2 つのオブジェクト (intクラスと文字列'100') が隣り合っており、演算子や、それらがどのように相互作用するかを示す他の指示がありません。
Python では "int" はクラスであり、"int('100')" を呼び出すと、int クラスの __init__ メソッドが引数 '100' で呼び出されます。これは int オブジェクトを構築します。
"(int)" という表現は "int" と同じです。Python には、他の言語のようなキャスト/変換演算子がありません。
Python では、関数はファースト クラス オブジェクトであるためint、 と(int)は実際には同じオブジェクトであり、組み込み関数intです。
>>> a = (int)
>>> a('100')
100
>>> a is int
True
上記の例のように関数を呼び出すことはできますが、C スタイルのキャストとして使用することはできません。