Python は動的型付け言語であり、変数のデータ型は開発者が明示的に介入することなく推論されます。
もし、リストを必要とするコードがあったとして、オプションである型ヒントを欠いた場合、使用される変数がリストでない場合のエラーをどのように回避できるでしょうか?
このチュートリアルでは、Pythonの type()
と isinstance()
関数、そして is
演算子を用いて、変数がリストであるかどうかをチェックする方法を見ていきます。
- 変数がリストかどうかを type() でチェックする
- 変数がリストであるかどうかを is 演算子で確認します。
- isinstance() で変数がリストであるかどうか確認する。
開発者は通常 type()
と is
を使用しますが、文脈によってはこれらに制限がある場合があり、その場合は isinstance()
関数を使用したほうがよいでしょう。
変数がリストかどうかをtype()でチェックする。
ビルトインの type()
関数は、オブジェクトのデータ型を返すために使用できます。ここでは、Dictionary、Tuple、List を作成し、type()
関数を使って変数が list
であるかどうかをチェックしてみましょう。
grocery_list = ["milk", "cereal", "ice-cream"]
aDict = {"username": "Daniel", "age": 27, "gender": "Male"}
aTuple = ("apple", "banana", "cashew")
# Prints the type of each variable
print("The type of grocery_list is ", type(grocery_list))
print("The type of aDict is ", type(aDict))
print("The type of aTuple is ", type(aTuple))
この結果は
The type of grocery_list is <class 'list'=""
The type of aDict is <class 'dict'=""
The type of aTuple is <class 'tuple'=""
さて、この関数の結果に基づいて、プログラム的にコードフローを変更する。
a_list = [1, 2, 3, 4, 5]
# Checks if the variable "a_list" is a list
if type(a_list) == list:
print("Variable is a list.")
else:
print("Variable is not a list.")
この結果は
"Variable is a list."
変数がリストであるかどうかをis演算子でチェックする
is` 演算子は Python で同一性を比較するために使用されます。つまり、2つのオブジェクトがメモリ上の同じ場所を参照しているかどうかをチェックするために使用されます。
type(variable)の結果は、常にその
variableのクラスと同じメモリ上の場所を指します。つまり、
type()関数の結果を
listクラスと比較すると、
variableがリストであれば
True` が返されます。
では、 is
演算子について見てみましょう。
a_list = [1, 2, 3, 4, 5]
print(type(a_list) is list)
この結果は
True
この結果は次のようになります。この方法が正しく行われているかどうか、メモリ上のオブジェクトのIDを比較してみましょう。
print("Memory address of 'list' class:", id(list))
print("Memory address of 'type(a_list)':", id(type(a_list)))
これで、同じ数字が返されるはずです。
Memory address of 'list' class: 4363151680
Memory address of 'type(a_list)': 4363151680
注意:この方法を選択した場合は、サブタイプに注意する必要があります。リストのサブタイプの type()
の結果を list
クラスと比較すると、たとえ変数がリストであっても、そのサブクラスであっても、 False
を返します。
この is
演算子の欠点は、次のアプローチ – isinstance()
関数を使用することで解決されます。
変数がリストであるかどうかをisinstance()でチェックする
isinstance()` 関数も、変数のデータ型をチェックするための組み込み関数です。この関数は、型をチェックする変数と、探している型という2つの引数を取ります。
この関数はサブクラスも考慮するので、 list
のサブクラスは list
のインスタンスであることを示す True
も返します。
それでは、通常の list
と collections
フレームワークの UserList
を使って、この機能を試してみましょう。
from collections import UserList
regular_list = [1, 2, 3, 4, 5]
user_list = [6, 7, 8, 9, 10]
# Checks if the variable "a_list" is a list
if isinstance(regular_list, list):
print("'regular_list' is a list.")
else:
print("'regular_list' is not a list.")
# Checks if the variable "a_string" is a list
if isinstance(user_list, list):
print("'user_list' is a list.")
else:
print("'user_list' is not a list.")
このコードを実行すると、次のような結果になります。
'regular_list' is a list.
'user_list' is a list.
結論
Python は動的型付け言語であり、時にはユーザーエラーによって予期しないデータ型を扱うことがあります。
このチュートリアルでは、Pythonで変数が list
であるかどうかを確認する3つの方法、 type()
関数、 is
演算子、 isinstance()
関数について説明しました。
</class