len() / type() / id()
| 対応: | Python 2(2000) |
|---|
オブジェクトの長さや型、メモリ上の識別子を調べる基本的な組み込み関数です。デバッグや型チェックに頻繁に使われます。
構文
# オブジェクトの要素数(長さ)を返します。 len(オブジェクト) # オブジェクトの型を返します。 type(オブジェクト) # オブジェクトのメモリ上の識別子(整数)を返します。 id(オブジェクト) # オブジェクトが指定した型のインスタンスか判定します。 isinstance(オブジェクト, 型) # クラスが指定したクラスのサブクラスか判定します。 issubclass(サブクラス, 親クラス)
関数一覧
| 関数 | 概要 |
|---|---|
| len(obj) | リスト・文字列・辞書など、要素を持つオブジェクトの要素数を整数で返します。 |
| type(obj) | オブジェクトの型(クラス)を返します。戻り値は型オブジェクトです。 |
| id(obj) | オブジェクトのメモリ上の一意な識別子を整数で返します。同一オブジェクトかどうかの確認に使います。 |
| isinstance(obj, classinfo) | オブジェクトが指定した型(またはその型のサブクラス)のインスタンスであれば True を返します。 |
| issubclass(class, classinfo) | 第一引数のクラスが第二引数のクラスのサブクラスであれば True を返します。 |
サンプルコード
sample_len_type_id.py
# len() でさまざまなオブジェクトの長さを取得します。
print(len("こんにちは")) # 5(文字数)
print(len([1, 2, 3, 4])) # 4(リストの要素数)
print(len({"a": 1, "b": 2})) # 2(辞書のキー数)
print(len((10, 20, 30))) # 3(タプルの要素数)
# type() でオブジェクトの型を確認します。
x = 42
y = "hello"
z = [1, 2, 3]
print(type(x)) # <class 'int'>
print(type(y)) # <class 'str'>
print(type(z)) # <class 'list'>
# id() でオブジェクトの識別子を確認します。
a = [1, 2, 3]
b = a # 同じオブジェクトを参照
c = [1, 2, 3] # 別のオブジェクト
print(id(a) == id(b)) # True(同じオブジェクト)
print(id(a) == id(c)) # False(別のオブジェクト)
# isinstance() で型チェックを行います。
num = 3.14
print(isinstance(num, float)) # True
print(isinstance(num, (int, float))) # True(複数の型を指定できます)
print(isinstance(num, str)) # False
# issubclass() でクラスの継承関係を確認します。
print(issubclass(bool, int)) # True(bool は int のサブクラス)
print(issubclass(int, float)) # False
python3 len_type_id.py 5 4 2 3 <class 'int'> <class 'str'> <class 'list'> True False True True False True False
概要
『len()』はリスト・文字列・タプル・辞書・セットなど、Pythonの組み込みシーケンス型すべてに使える関数です。独自クラスで使いたい場合は、クラスに『__len__()』メソッドを実装します。
『type()』は引数を1つ渡すとオブジェクトの型を返し、引数を3つ渡すと動的にクラスを生成します。型の比較には『type(x) == int』より『isinstance(x, int)』を使うことが推奨されます。『isinstance()』はサブクラスも含めて判定するためより柔軟です。
『id()』はオブジェクトのメモリアドレスに相当する一意な整数を返します。Pythonでは小さい整数や短い文字列はインターン(キャッシュ)されるため、予想外に同じIDを持つことがあります。オブジェクトの同一性を確認したい場合は『is』演算子を使うほうが明確です。型変換については『int() / float() / str() / bool()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。