はじめに
Python の is 演算子は、2 つの変数がメモリ内の同じオブジェクトを参照しているかどうかを確認するために使用されます。これは、2 つの変数が同じ値を持っているかどうかを確認する == 演算子とは異なります。この実験では、is 演算子がどのように機能するか、および Python プログラミングにおいてどのように役立つかを探ります。これは、特にリストや辞書のような可変オブジェクトを扱う際に理解する重要な概念です。この実験では、単純な例と複雑な例を用いて Python における is 演算子の使い方を探り、効率的で信頼性の高いコードを書くためにどのように使用できるかを見ていきます。
基本的な使い方
このステップでは、is 演算子の最も基本的な使い方から始めます。
- ターミナルで Python インタプリタを開きます。
python3
- 2 つの変数
aとbを定義し、両方に同じ値を割り当てます。
a = "Hello"
b = "Hello"
id()関数を使ってaとbのメモリアドレスを表示します。
print(id(a))
print(id(b))
is演算子を使ってaとbが同じオブジェクトを参照しているかどうかを確認します。
print(a is b)
上記のコードの出力は True になるはずです。なぜなら、a と b はメモリ内の同じオブジェクトを参照しているからです。
不変オブジェクトと可変オブジェクト
このステップでは、is 演算子が不変オブジェクトと可変オブジェクトとどのように振る舞うかを探ります。
- 2 つの変数
cとdを定義し、それぞれ空のリスト[]を割り当てます。
c = []
d = []
id()関数を使ってcとdのメモリアドレスを表示します。
print(id(c))
print(id(d))
is演算子を使ってcとdが同じオブジェクトを参照しているかどうかを確認します。
print(c is d)
上記のコードの出力は False になるはずです。なぜなら、c と d は可変オブジェクトであり、メモリ内で同じオブジェクトではないからです。
- 次に、2 つの変数
eとfを定義し、それぞれ整数値を割り当てます。
e = 10
f = 10
id()関数を使ってeとf的メモリアドレスを表示します。
print(id(e))
print(id(f))
is演算子を使ってeとfが同じオブジェクトを参照しているかどうかを確認します。
print(e is f)
上記のコードの出力は True になるはずです。なぜなら、e と f は不変オブジェクトであり、メモリ内で同じオブジェクトを共有しているからです。
関数のパラメータ
このステップでは、is 演算子を関数のパラメータとしてどのように使用できるかを探ります。
- 2 つのパラメータ
xとyを持つ関数my_function()を定義します。
def my_function(x, y):
print(x is y)
- 関数
my_function()を 2 回呼び出します。1 回は不変オブジェクトを使って、もう 1 回は可変オブジェクトを使って呼び出します。
my_function(10, 10)
my_function([], [])
最初の呼び出しの出力は True で、2 番目の呼び出しの出力は False になるはずです。
高度な使い方
このステップでは、is 演算子のいくつかの高度な使い方を探ります。
- 属性
valueを持つMyClassクラスを定義します。
class MyClass:
def __init__(self, value):
self.value = value
- 同じ
valueを持つMyClassクラスの 2 つのインスタンスobj1とobj2を定義します。
obj1 = MyClass("Hello")
obj2 = MyClass("Hello")
id()関数を使ってobj1.valueとobj2.valueのメモリアドレスを表示します。
print(id(obj1.value))
print(id(obj2.value))
is演算子を使ってobj1.valueとobj2.valueが同じオブジェクトを参照しているかどうかを確認します。
print(obj1.value is obj2.value)
上記のコードの出力は True になるはずです。なぜなら、value 属性は不変オブジェクトであり、両インスタンスはメモリ内で同じオブジェクトを共有しているからです。
- 次に、可変オブジェクトを
valueとして持つMyClassクラスの 2 つのインスタンスobj3とobj4を定義します。
obj3 = MyClass([])
obj4 = MyClass([])
id()関数を使ってobj3.valueとobj4.valueのメモリアドレスを表示します。
print(id(obj3.value))
print(id(obj4.value))
is演算子を使ってobj3.valueとobj4.valueが同じオブジェクトを参照しているかどうかを確認します。
print(obj3.value is obj4.value)
上記のコードの出力は False になるはずです。なぜなら、value 属性は可変オブジェクトであり、両インスタンスはメモリ内で同じオブジェクトを共有していないからです。
まとめ
この実験では、Python の is 演算子と、2 つの変数がメモリ内の同じオブジェクトを参照しているかどうかを確認するためにそれをどのように使用できるかについて学びました。不変オブジェクトと可変オブジェクト、関数のパラメータ、クラスのインスタンスの両方に対する is 演算子の動作を調べました。is 演算子を理解することで、より効率的で信頼性の高い Python コードを書くことができます。



