Python の is 演算子

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Python の is 演算子は、2 つの変数がメモリ内の同じオブジェクトを参照しているかどうかを確認するために使用されます。これは、2 つの変数が同じ値を持っているかどうかを確認する == 演算子とは異なります。この実験では、is 演算子がどのように機能するか、および Python プログラミングにおいてどのように役立つかを探ります。これは、特にリストや辞書のような可変オブジェクトを扱う際に理解する重要な概念です。この実験では、単純な例と複雑な例を用いて Python における is 演算子の使い方を探り、効率的で信頼性の高いコードを書くためにどのように使用できるかを見ていきます。

基本的な使い方

このステップでは、is 演算子の最も基本的な使い方から始めます。

  1. ターミナルで Python インタプリタを開きます。
python3
  1. 2 つの変数 ab を定義し、両方に同じ値を割り当てます。
a = "Hello"
b = "Hello"
  1. id() 関数を使って ab のメモリアドレスを表示します。
print(id(a))
print(id(b))
  1. is 演算子を使って ab が同じオブジェクトを参照しているかどうかを確認します。
print(a is b)

上記のコードの出力は True になるはずです。なぜなら、ab はメモリ内の同じオブジェクトを参照しているからです。

不変オブジェクトと可変オブジェクト

このステップでは、is 演算子が不変オブジェクトと可変オブジェクトとどのように振る舞うかを探ります。

  1. 2 つの変数 cd を定義し、それぞれ空のリスト [] を割り当てます。
c = []
d = []
  1. id() 関数を使って cd のメモリアドレスを表示します。
print(id(c))
print(id(d))
  1. is 演算子を使って cd が同じオブジェクトを参照しているかどうかを確認します。
print(c is d)

上記のコードの出力は False になるはずです。なぜなら、cd は可変オブジェクトであり、メモリ内で同じオブジェクトではないからです。

  1. 次に、2 つの変数 ef を定義し、それぞれ整数値を割り当てます。
e = 10
f = 10
  1. id() 関数を使って ef 的メモリアドレスを表示します。
print(id(e))
print(id(f))
  1. is 演算子を使って ef が同じオブジェクトを参照しているかどうかを確認します。
print(e is f)

上記のコードの出力は True になるはずです。なぜなら、ef は不変オブジェクトであり、メモリ内で同じオブジェクトを共有しているからです。

関数のパラメータ

このステップでは、is 演算子を関数のパラメータとしてどのように使用できるかを探ります。

  1. 2 つのパラメータ xy を持つ関数 my_function() を定義します。
def my_function(x, y):
    print(x is y)
  1. 関数 my_function() を 2 回呼び出します。1 回は不変オブジェクトを使って、もう 1 回は可変オブジェクトを使って呼び出します。
my_function(10, 10)
my_function([], [])

最初の呼び出しの出力は True で、2 番目の呼び出しの出力は False になるはずです。

高度な使い方

このステップでは、is 演算子のいくつかの高度な使い方を探ります。

  1. 属性 value を持つ MyClass クラスを定義します。
class MyClass:
    def __init__(self, value):
        self.value = value
  1. 同じ value を持つ MyClass クラスの 2 つのインスタンス obj1obj2 を定義します。
obj1 = MyClass("Hello")
obj2 = MyClass("Hello")
  1. id() 関数を使って obj1.valueobj2.value のメモリアドレスを表示します。
print(id(obj1.value))
print(id(obj2.value))
  1. is 演算子を使って obj1.valueobj2.value が同じオブジェクトを参照しているかどうかを確認します。
print(obj1.value is obj2.value)

上記のコードの出力は True になるはずです。なぜなら、value 属性は不変オブジェクトであり、両インスタンスはメモリ内で同じオブジェクトを共有しているからです。

  1. 次に、可変オブジェクトを value として持つ MyClass クラスの 2 つのインスタンス obj3obj4 を定義します。
obj3 = MyClass([])
obj4 = MyClass([])
  1. id() 関数を使って obj3.valueobj4.value のメモリアドレスを表示します。
print(id(obj3.value))
print(id(obj4.value))
  1. is 演算子を使って obj3.valueobj4.value が同じオブジェクトを参照しているかどうかを確認します。
print(obj3.value is obj4.value)

上記のコードの出力は False になるはずです。なぜなら、value 属性は可変オブジェクトであり、両インスタンスはメモリ内で同じオブジェクトを共有していないからです。

まとめ

この実験では、Python の is 演算子と、2 つの変数がメモリ内の同じオブジェクトを参照しているかどうかを確認するためにそれをどのように使用できるかについて学びました。不変オブジェクトと可変オブジェクト、関数のパラメータ、クラスのインスタンスの両方に対する is 演算子の動作を調べました。is 演算子を理解することで、より効率的で信頼性の高い Python コードを書くことができます。