Python - 変数

変数

変数とは、実際のデータを指す名前のことです。変数は、ブール値、整数、浮動小数点数、文字列、リスト、タプル、辞書などのオブジェクトにデータを入れた「箱」のような存在です。どのようなデータが入っているのか示すために箱には変数名という名前を付けることができます。

Python では、変数名を前もって宣言をしなくても、値を代入するだけで変数が作成できます。変数名に使用できる文字は以下のとおりです。

  • 小文字の英字 (az)
  • 大文字の英字 (AZ)
  • 数字 (09)
  • アンダースコア (_)

ただし、上記の文字を使用しても以下のルールには注意する必要があります。

  • 数字は変数名の先頭としては使えません
  • 大文字と小文字は区別されます (例えば、SPAMspam は区別されます)
  • 名前の先頭がアンダースコアになっている変数は特別扱いされます
  • 予約語は変数名としては使用できません (後述)

Python では変数名を命名するときにいくつかの慣例があります。例えば、先頭と末尾に 2 つアンダースコアを付けた名前 (__name__ など) は、変数名としては使わないなどが挙げられます。このような名前は、Python にとって特別な意味を持つからです。Python における変数名に関する慣例としては、以下のとおりです。

  • 先頭にアンダースコアを付けた名前 (_x など) は使わない。これは、from module import * ステートメントでインポートできなくなるためです。
  • 先頭と末尾に 2 つアンダースコアを付けた名前 (__name__ など) は使わない。これは、システム定義のインタプリタにとって、特別な意味を持つ名前に使われることが多いためです。
  • 先頭に 2 つアンダースコアを付けた名前 (__x など) は使わない。これは、所属するクラスの名前を付けた名前に自動的に変換 (マングリング) されるためです。このような変数は、クラス外部からの参照ができなくなります。
  • アンダースコアが 1 つだけで構成される名前 (_) は使わない。これは、対話型インタープリタで、直前に実行された式の演算結果を保持するために使用されるためです。

上記の慣例は、いずれも Python インタプリタの機能に関係するものですが、その他にもPythonプログラマが従っている慣例はあります。例えば、以下のようなものです。

  • 大文字で始まる名前はクラスの名前に使用されるため、変数には使用しない。
  • モジュール名は小文字にする。
  • self は予約語ではないが、特別な意味を持つため変数名としては使用しない。

Python の変数において極めて重要なポイントがあります。それは、変数名はただの名前であり、代入したからといって値はコピー (値渡し) されないということです。Python は、変数や関数に値を渡す場合はすべて参照渡しで渡されています。例えば、値渡しのように見える int 型においてさえ、値が変更されるまでは元の値と同一のオブジェクトを参照しています。このような問題は、配列をコピーするときには特に注意すべきです。

list1 = [1, 2, 3]
list2 = list1
list2[2] = 100

print(list1)
# [1, 2, 100]
参照渡し (シャローコピー)

上記の list1list2 は変数名が異なりますが、同じデータを参照しています。同じデータを参照しているかどうかは、id() 関数を使って調べることができます。

list1 = [1, 2, 3]
list2 = list1

print(id(list1))
# 2136166462152
print(id(list2))
# 2136166462152
参照渡し (シャローコピー)

このような問題を回避する方法のひとつとして、copy() 関数を使う方法があります。

list1 = [1, 2, 3]
list2 = list1.copy()

print(id(list1))
# 2829688981000
print(id(list2))
# 2829698365192
値渡し (ディープコピー)

関連記事