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 スタイルのキャストとして使用することはできません。