変数とメモリアドレス

PythonBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、Python の変数、メモリアドレス、および変更可能と変更不可能なデータ型の違いを探ります。

  • 変更不可能なデータ型:これらのデータ型は作成後に変更できません。例としては、intfloatstrtuple、およびfrozensetがあります。
  • 変更可能なデータ型:これらのデータ型は作成後に変更できます。例としては、listdict、およびsetがあります。

変更不可能なデータ型では、変更が行われるたびに新しいオブジェクトが作成されますが、変更可能なデータ型はその場所で変更できます。この違いを理解することは、メモリアドレスと変数割り当てを扱う際に重要です。

変数割り当て、変更可能と変更不可能なデータ型の特性、およびメモリアドレスを比較するためのis演算子について説明します。始めましょう!

変数の割り当てとメモリアドレス

Python では、変数は値が格納されているメモリ位置への参照にすぎません。変数に値を割り当てると、Python は必要に応じて新しいオブジェクトを作成し、そのオブジェクトを参照するように変数を設定します。

まず Python インタプリタを開きましょう。

python

例を見てみましょう。

x = 10
y = x

この例では、変数xに値10が割り当てられています。xyに割り当てると、両方の変数は同じメモリ位置を参照するようになります。これをid()関数を使って確認できます。

print(id(x))  ## 出力:x のメモリアドレス
print(id(y))  ## 出力:y のメモリアドレス。x と同じであるはず

is演算子

Python では、is演算子は 2 つのオブジェクトのメモリアドレスを比較します。メモリアドレスが同じ場合、is演算子はTrueを返します。それ以外の場合はFalseを返します。これは、オブジェクトの値を比較する==演算子とは異なります。

x = [1, 2, 3]
y = x
z = [1, 2, 3]

print(x is y)  ## 出力:True (x と y は同じメモリアドレスを持つ)
print(x is z)  ## 出力:False (x と z は異なるメモリアドレスを持つ)

メモリアドレスを比較する

このステップでは、同じ値を持つ変数のメモリアドレスを比較します。

以下の手順に従ってください。

## 同じ値を持つ 2 つの整数型変数 `a` と `b` を作成します。
a = 10
b = 10
## 同じ要素を持つ 2 つのリスト型変数 `c` と `d` を作成します。
c = [1, 2, 3]
d = [1, 2, 3]

## `a` と `b`、および `c` と `d` のメモリアドレスを比較します。
print(a is b)  ## 出力:True
print(c is d)  ## 出力:False

上記の例では、同じ値を持つ 2 つの整数型変数 ab を作成しました。

同じ要素を持つ 2 つのリスト型変数 cd も作成しました。

ab のメモリアドレスを比較すると、is 演算子は True を返しました。これは、ab が同じメモリアドレスを共有しているためです。

ただし、cd のメモリアドレスを比較すると、is 演算子は False を返しました。これは、cd が異なるメモリアドレスを持っているためです。

では、これは何を意味するのでしょうか。

  1. 同じ値を持つ変更不可能なデータ型は、同じメモリアドレスを持つ場合があります。
  2. 同じ値を持つ変更可能なデータ型は、異なるメモリアドレスを持ちます。

変更可能なデータ型の変更

次に、変更可能なデータ型を作成して変更しましょう。

## 同じリストを参照する 2 つの変数 `x` と `y` を作成します。
x = [1, 2, 3]
y = x

## 変数 `x` を使ってリストを変更します。
x.append(4)

## 変数 `y` の変化を観察します。
print(y)  ## 出力:[1, 2, 3, 4] (x と y は同じメモリアドレスを共有するため、y も変更を反映します)

この例では、同じリストを参照する 2 つの変数 xy を作成しました。

変数 x を使ってリストを変更すると、変更は変数 y にも反映されました。これは、xy が同じメモリアドレスを共有しているためです。

不変データ型の変更

最後に、1 つの変更不可能なデータ型を次々と変更していきましょう。

## 同じ文字列を参照する 2 つの変数 `a` と `b` を作成します。
a = "hello"
b = a

## 変数 `a` を使って文字列を変更します。
a = a + ", world"

## 変数 `b` の変化を観察します。
print(b)  ## 出力:"hello" (文字列を変更する際に新しいオブジェクトが作成されたため、b は変化しません)

この例では、同じ文字列を参照する 2 つの変数 ab を作成しました。

変数 a を使って文字列を変更すると、変更は変数 b には反映されませんでした。これは、ab が異なるメモリアドレスを持っているためです。

まとめ

この高度なチュートリアルでは、Python の変数とメモリアドレスについてさらに深く掘り下げました。変数の割り当て、変更可能と変更不可能なデータ型、およびメモリアドレスを比較するためのis演算子について説明しました。また、これらの概念を実際の演習で練習しました。これらの高度な概念を理解することは、Python がメモリをどのように管理し、変数がどのように機能するかをより深く洞察することができるため、より熟練した Python プログラマーになるのに役立ちます。