Python/変数と代入

出典: フリー教科書『ウィキブックス(Wikibooks)』



変数とは[編集]

Pythonにおける変数は、値に対して名前(または識別子)を付けたものです。変数を定義するには、単に変数名を使って値を代入します。以下は例です:

my_variable = 42

この例では、my_variable という変数に整数の値 42 が代入されています。変数は値を格納するだけでなく、後でその値を変更することもできます。

Pythonの変数には型がありません。つまり、変数自体には整数、文字列、リストなどの特定の型が割り当てられるのではなく、変数が保持する値がその型を持っています。これにより、同じ変数が異なる型の値になることが可能です。

my_variable = 42  # 整数型
my_variable = "Hello, World!"  # 文字列型

このように、同じ変数が異なる型の値に変わることを「動的型付け」と呼びます。変数が保持する値の型は、実行時に決定されます。

変数を使うことで、データや計算結果を記憶し、再利用することができます。変数名は意味を持たせ、コードの可読性を向上させるために工夫されることが一般的です。

変数と参照[編集]

変数と参照について理解するためには、Pythonにおける変数の動作について知ることが重要です。

  1. 変数の定義: 変数は値に対して名前を付けるものであり、代入によって値を変数に紐付けます。例えば:
    x = 42
    
    この場合、変数 x は整数値 42 を参照しています。
  2. 変数の参照: 変数はその値を保持するのではなく、値への参照を保持します。変数を使って値を取得したり変更したりするとき、実際にはその値への参照を操作しています。
    y = x  # yはxと同じ値を参照
    
    この場合、yx と同じ値を参照しています。これは、y に変更が加えられても x にも同様の変更が影響する可能性があります。
  3. オブジェクトの参照: Pythonでは全てがオブジェクトです。変数はオブジェクトへの参照を持ちます。例えば、リストや文字列もオブジェクトです。
    list_a = [1, 2, 3]
    list_b = list_a  # list_bはlist_aと同じリストを参照
    
    ここで、list_blist_a と同じリストを参照しており、片方のリストを変更するともう一方にも影響します。
  4. 変更可能なオブジェクトと不変なオブジェクト: リストや辞書などの変更可能なオブジェクトは、その値が変更されると変更が反映されます。しかし、整数や文字列などの不変なオブジェクトは変更できません。
    immutable_value = 42
    mutable_list = [1, 2, 3]
    
    immutable_value = 99  # 新しい値に変更
    mutable_list.append(4)  # リストに要素を追加
    
    immutable_value の変更は新しい値に変わりますが、mutable_list の変更は元のリストに影響を与えます。

理解の鍵は、変数は値を持たず、値への参照を持つという点です。これにより、変数同士が同じオブジェクトを共有することができ、一方の変数を通じてオブジェクトが変更されると他方の変数にも変更が反映される可能性があります。

[編集]

Pythonにはさまざまなデータ型が組み込まれています。以下は主なデータ型の一部です:

# 整数型 (int):
# 整数を表すための型です。例えば:
x = 5

# 浮動小数点型 (float):
# 小数点を持つ実数を表すための型です。例えば:
y = 3.14

# 文字列型 (str):
# 文字列を表すための型で、シングルクォート (') またはダブルクォート (") で囲まれたテキストです。例えば:
name = "John"

# リスト型 (list):
# 複数の要素を順序付きで格納するための型です。例えば:
numbers = [1, 2, 3, 4, 5]

# タプル型 (tuple):
# リストと似ていますが、不変 (immutable) な型で、要素の変更ができません。例えば:
coordinates = (3, 4)

# 辞書型 (dict):
# キーと値のペアを格納するための型で、連想配列とも呼ばれます。例えば:
person = {"name": "Alice", "age": 30, "city": "Wonderland"}

# 集合型 (set):
# 重複のない要素の集まりを表すための型です。例えば:
unique_numbers = {1, 2, 3, 4, 5}

# ブール型 (bool):
# 真 (True) または偽 (False) の値を持つ型です。条件分岐や論理演算で使用されます。例えば:
is_adult = True

変数には型がなくオブジェクトに型がある[編集]

type()関数を使用すると、変数や値の型を取得できます。これを使って先程の例を確認してみましょう。

x = 5
y = "Hello"
z = 3.14

print(type(x))  # <class 'int'>
print(type(y))  # <class 'str'>
print(type(z))  # <class 'float'>

ここでtype()関数は、変数や値の型を返します。xは整数型 (int)、yは文字列型 (str)、zは浮動小数点数型 (float) です。

同じ変数に異なる型の値を代入する場合にも、type()を使用して型の変化を確認できます。

z = 3.14
print(type(z))  # <class 'float'>

z = "World"
print(type(z))  # <class 'str'>

ここでzは最初にfloat型を持ち、後でstr型に変化しています。

代入[編集]

Pythonにおける代入は、左辺の識別子に右辺のオブジェクトをバインド(結びつけ)する操作です。これは、変数が特定の値やオブジェクトを参照する仕組みを表しています。

例えば、以下のコードを考えましょう:

x = 5

この場合、xという識別子(変数)に整数型のオブジェクト 5 がバインドされています。このバインディングにより、xを通じて 5 にアクセスできます。

また、代入によって同じオブジェクトが複数の識別子にバインドされることもあります。例えば:

a = [1, 2, 3]
b = a

ここで、abは同じリストオブジェクトを参照しています。これは、リストなどの変更可能な(mutable)オブジェクトが変数を介して変更されると、その変更が他の変数にも反映されるためです。

変数には意味のある名前をつけましょう[編集]

変数には意味のある名前を付けることは、コードの可読性を向上させ、保守性を高めます。意味のある名前を使うことで、コードを読んだりメンテナンスしたりする際に変数が表す内容や目的が明確になります。 例えば:

age = 25  # 年齢を表す変数名
name = "Alice"  # 名前を表す変数名
user_list = [1, 2, 3]  # ユーザーのリストを表す変数名

これらの変数名は、それぞれの変数が何を表しているかをわかりやすく示しています。コードが複雑になると、意味のある名前が特に重要です。

ただし、名前があまりにも長すぎたり複雑すぎたりすると、逆にコードの読みやすさを損なうことがあります。バランスを取りながら、適切な名前を選ぶことが重要です。

識別子とキーワード[編集]

識別子[編集]

識別子(Identifiers)は、Pythonで変数、関数、クラス、モジュールなどに付ける名前を指します。Pythonの識別子にはいくつかのルールがあります:

  1. 識別子は英字またはアンダースコア(_)で始まる必要があります。
  2. その後には英数字またはアンダースコアを含めることができます。
  3. 大文字と小文字は区別されます。
  4. Pythonのキーワード(後述)は使用できません。

以下は、識別子の例です:

my_variable = 42
user_name = "John"
calculate_sum = lambda x, y: x + y

これらの例では、それぞれ変数、変数、関数に使用されている識別子です。適切で意味のある名前を使い、コードを読みやすくするために、識別子には十分な注意が払われるべきです。

識別子に使えるASCII範囲外の文字[編集]

Python 3.0からはASCII範囲外の文字の一部も識別子に使用できるようになりました。これにはUnicode文字も含まれます。具体的には、以下の種類の文字が使えます:

  • Lu - uppercase letters - 大文字
  • Ll - lowercase letters - 小文字
  • Lt - titlecase letters - 表題文字
  • Lm - modifier letters - 擬似文字
  • Lo - other letters - その他の文字(漢字はここ)
  • Nl - letter numbers - 数値を表す文字
  • Mn - nonspacing marks - 幅なし記号
  • Mc - spacing combining marks - 幅あり結合記号
  • Nd - decimal numbers - 十進数数字
  • Pc - connector punctuations - 連結句記号
  • Other_ID_Start - Unicode標準のプロパティリストに明示的にリストされた文字
  • Other_ID_Continue - 同上

ただし、この拡張を使用する際には、表示や編集の問題、正規化に関する問題に注意する必要があります。通常、ASCIIの範囲内に収める方が適切ですが、国際化や特定の文脈で必要な場合にはこの機能を活用することができます。

キーワード[編集]

キーワード(Keywords)は、Pythonの構文規則の中に現れる特別なトークンで、識別子の様式に合致するにも関わらず、識別子には使用できない単語の集合です[1]。 次に示すキーワードは識別子には使用できません[2]

キーワードの一覧を表示するスクリプト
import keyword

print(' '.join(keyword.kwlist))
実行結果
False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield

ソフト・キーワード[編集]

Python 3.10 からは "ソフト・キーワード"(Soft keywords) として知られる概念が導入されました[3]。ソフト・キーワードは、通常のキーワードと同じく構文上特別な意味を持つが、一般の識別子としても利用できる単語です。Pythonでは、以下の単語がソフト・キーワードとして扱われます:

  • case
  • match
  • _

これらの単語は、通常のキーワードとして特別な文脈で使われる場合にはキーワードとして解釈されますが、一般のコードの中で普通の識別子としても利用できます。これは、特にパターン・マッチング関連の新しい機能をサポートするために導入されました。

予約済み識別子クラス[編集]

予約済み識別子クラス(Reserved classes of identifiers)[4]は、キーワードやソフト・キーワード以外の識別子で特別な意味を持つものです[5]。 予約済み識別子クラスは、先頭と末尾のアンダースコア文字のパターンによって識別されます。

_*
from module import * でインポートされていません。
_
match文の中のcaseパターンでは、_はワイルドカードを表すソフトキーワードです。
これとは別に、対話型インタープリタでは、最後に評価した結果を変数 _ に格納して利用できるようにしています(これは、print などの組み込み関数と一緒に builtins モジュールに格納されています)。
その他の場所では,_は通常の識別子です.これはしばしば「特別な」アイテムの名前に使われますが、Python自体にとっては特別なものではありません。
Note
_ はしばしば国際化に関連して使用されます。この慣習についての詳細は gettext モジュールのドキュメントを参照してください。
また、使われていない変数にもよく使われます。
__*__
システムで定義された名前で、非公式には "dunder "名として知られています。これらの名前は、インタープリタとその実装(標準ライブラリを含む)によって定義されます。現在のシステム名については、「特別なメソッド名」のセクションなどで説明しています。Pythonの将来のバージョンでは、さらに多くの名前が定義されるでしょう。明示的に文書化された使用方法に従わない、いかなる文脈での __*__ 名の使用も、警告なしに破壊される可能性があります。
__*
クラスプライベートな名前です。このカテゴリの名前は、クラス定義の文脈の中で使用された場合、基底クラスと派生クラスの "private "属性の間の名前の衝突を避けるために、マングルされたフォームを使用するように書き直されます。

アトム[編集]

アトムは、式の最も基本的な要素です。最も単純なアトムは、識別子またはリテラルです。括弧や大括弧、中括弧で囲まれた形式も、構文上はアトムに分類されます[6]

識別子(名前)[編集]

アトムとして出現する識別子は名前です[7]

名前がオブジェクトにバインドされている場合、アトムを評価するとそのオブジェクトが得られます。名前がバインドされていない場合、評価しようとすると NameError という例外が発生します。

プライベート名のマングリング。
クラス定義に含まれる識別子が、2つ以上のアンダースコアで始まり、2つ以上のアンダースコアで終わらない場合、そのクラスのプライベート名とみなされます。プライベート・ネームは、コードが生成される前に長い形式に変換されます。この変換では、クラス名の前に、先頭のアンダースコアを削除し、1つのアンダースコアを挿入します。例えば、Hamという名前のクラスで発生した識別子__spamは、_Ham__spamに変換されます。この変換は、識別子が使用されている構文上の文脈とは関係ありません。変換後の名前が極端に長い(255文字以上)場合は、実装で定義された切り捨てが行われることがあります。クラス名がアンダースコアだけで構成されている場合、変換は行われません。

組込み関数や、組込み型はキーワードではありません[編集]

組込み関数(例えば print)や、組込み型(例えば int)はキーワードではありません。 キーワードではありませんが、迂闊に組込み関数や組込み型と同じ名前の変数や関数を定義すると、次から関数が使えなくなります。 回避方法はあります。

コード例
p=print
print=123
p(print)
実行結果
123
printを123で代入し参照不能に陥る前に、pに(実行結果でなく)print関数を代入しています。
関数呼び出しは、保存した p を介して行っています。

回避方法はあるものの、読んだヒト[8]が混乱するので組込み関数や型と重複した識別子は使わないように心がけましょう。


脚註[編集]

  1. ^ keyword — Testing for Python keywords” (2021年11月29日).テンプレート:Cite web/error
  2. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.1. Keywords” (2021年11月29日).テンプレート:Cite web/error
  3. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.2. Soft Keywords” (2021年11月29日).テンプレート:Cite web/error
  4. ^ Reserved classes of identifiersを「予約済み識別子クラス」と訳しました。ここで言うクラスはオブジェクト指向プログラミングでいう Class ではなく階級や種類という一般的普遍的な意味のクラスです。
  5. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.3. Reserved classes of identifiers” (2021年11月29日).テンプレート:Cite web/error
  6. ^ 3.10.0 Documentation » The Python Language Reference » 6. Expressions§6.2. Atoms” (2021年11月29日).テンプレート:Cite web/error
  7. ^ 3.10.0 Documentation » The Python Language Reference » 6. Expressions§6.2.1. Identifiers (Names)” (2021年11月29日).テンプレート:Cite web/error
  8. ^ 将来のあなたかもしれません。


参考文献[編集]