このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】変数は値のオブジェクトを参照している

変数は値のオブジェクトを参照している

 Pythonプログラミングにおいて、変数は単なる値の保存場所ではなく、オブジェクトへの参照を保持する重要な役割を果たします。これにより、変数間で同じオブジェクトを共有したり、オブジェクトの状態を柔軟に管理したりすることが可能となります。ここでは、Pythonにおける変数の仕組み、オブジェクトの参照方法、そしてid関数やis演算子を用いたオブジェクトの同一性確認について詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.Pythonにおける変数の仕組み

 Pythonでは、変数はオブジェクトへの参照を保持しています。これは、他の多くのプログラミング言語(例えばC/C++やJava)とは異なる点で、変数自体がデータを直接保持するのではなく、データが格納されたオブジェクトを指し示しています。

Pythonにおける変数の仕組み

それぞれの変数がどのメモリオブジェクトを参照しているかを中央の矢印で表しています。

メモリ上のオブジェクト参照先メモリ上の変数(一覧)
アドレス: 1000000
型: 整数 (Integer)
値: 123
変数名: x
参照先: アドレス 1000000
アドレス: 2000000
型: 浮動小数点数 (Float)
値: 4.56
変数名: y
参照先: アドレス 2000000
アドレス: 3000000
型: 文字列 (String)
値: 'abc'
変数名: z
参照先: アドレス 2000000

ポイント

  • 変数はオブジェクトへの参照を保持する。
  • 同じオブジェクトを複数の変数が参照することができる。
  • 変数に新しい値を代入すると、変数は新しいオブジェクトを参照するようになる。

2.オブジェクトと参照

 Pythonでは、すべてのデータ(整数、浮動小数点数、文字列、リスト、辞書など)はオブジェクトとして扱われます。変数はこれらのオブジェクトを参照するための名前です。

例:オブジェクトへの参照

# 整数オブジェクトへの参照
a = 10
print(a)  # 出力: 10

# 文字列オブジェクトへの参照
b = "Hello, Python!"
print(b)  # 出力: Hello, Python!

# リストオブジェクトへの参照
c = [1, 2, 3]
print(c)  # 出力: [1, 2, 3]

実行結果

10
Hello, Python!
[1, 2, 3]

解説

  • 変数aは整数オブジェクト10を参照しています。
  • 変数bは文字列オブジェクト"Hello, Python!"を参照しています。
  • 変数cはリストオブジェクト[1, 2, 3]を参照しています。

3.id関数を使ってオブジェクトの識別番号を取得

 Pythonでは、id()関数を使用してオブジェクトの一意な識別番号(通常はメモリアドレス)を取得することができます。これにより、異なる変数が同じオブジェクトを参照しているかどうかを確認することが可能です。

例:id関数の使用

# 同じオブジェクトを参照する変数
x = [4, 5, 6]
y = x

print(id(x))  # 例: 140352736239296
print(id(y))  # 例: 140352736239296

# 別々のオブジェクトを参照する変数
z = [4, 5, 6]
print(id(z))  # 例: 140352736239488

実行結果

2279622464192
2279622464192
2279622463424

解説

  • 変数xyは同じリストオブジェクトを参照しているため、id(x)id(y)は同じ値を返します。
  • 変数zは新しいリストオブジェクトを参照しているため、id(z)xyとは異なる値を返します。

4.isis not演算子による同一性の確認

 is演算子とis not演算子を使用することで、二つの変数が同じオブジェクトを参照しているかどうかを確認できます。これは、値が等しいかどうかを確認する==演算子とは異なります。

例:isis not演算子の使用

# 同じオブジェクトを参照する変数
a = "Python"
b = a

print(a is b)       # 出力: True
print(a is not b)   # 出力: False

# 異なるオブジェクトを参照する変数
c = "Python"
d = "Java"

print(c is d)       # 出力: False
print(c is not d)   # 出力: True

# リストオブジェクトの場合
e = [1, 2, 3]
f = [1, 2, 3]

print(e is f)       # 出力: False
print(e is not f)   # 出力: True

実行結果

True
False
False
True
False
True

解説

  • 変数abは同じ文字列オブジェクトを参照しているため、a is bTrueを返します。
  • 変数cdは異なる文字列オブジェクトを参照しているため、c is dFalseとなります。
  • 変数efは同じ内容のリストを持っていますが、異なるオブジェクトを参照しているため、e is fFalseを返します。

5.==!=演算子による値の等価性の確認

 ==演算子と!=演算子は、二つの変数のが等しいかどうかを比較します。これは、変数が同じオブジェクトを参照しているかどうかを確認するis演算子とは異なります。

例: ==!=演算子の使用

# 同じ値を持つ異なるオブジェクト
a = [7, 8, 9]
b = [7, 8, 9]

print(a == b)        # 出力: True
print(a is b)        # 出力: False

# 数値の比較
x = 100
y = 100

print(x == y)        # 出力: True
print(x is y)        # 出力: True(小さな整数はキャッシュされるため同一オブジェクト)

# 文字列の比較
str1 = "Data"
str2 = "Data"        # 出力: True(小さな文字列はキャッシュされるため同一オブジェクト

print(str1 == str2)  # 出力: True
print(str1 is str2)  # 出力: True

実行結果

True
False
True
True
True
True

解説

  • 変数abは異なるリストオブジェクトを参照していますが、内容が同じため、a == bTrueを返します。一方、a is bFalseです。
  • 変数xyは小さな整数を参照しているため、x is yTrueになります。
  • 変数str1str2は同じ文字列を参照しているため、str1 is str2Trueです。

まとめ

 ここでは、Pythonにおける変数が値のオブジェクトを参照しているという概念について学びました。

  • 変数の仕組み:変数はオブジェクトへの参照を保持し、同じオブジェクトを複数の変数が参照することができる。
  • id関数:オブジェクトの一意な識別番号を取得し、変数が同じオブジェクトを参照しているかを確認できる。
  • isis not演算子:オブジェクトの同一性を確認するために使用し、二つの変数が同じオブジェクトを参照しているかどうかを判断できる。
  • ==!=演算子:値の等価性を比較し、異なるオブジェクトでも内容が同じ場合にTrueを返す。

 これらの知識を基に、Pythonプログラム内で変数を効果的に活用し、オブジェクトの管理や比較を適切に行うことができます。次のコンテンツでは、変数と定数は名前で区別することについて詳しく解説していきます。ぜひ、実際にコードを書きながら、変数の参照とオブジェクトの関係を体験してみてください。