Python/変数と代入

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

変数とは[編集]

pythonでいう「変数」(へんすう)とは、値につけられた名前(識別子)です。

コード例
a = 5
b = a + 2
print(b)
実行結果
7
abが変数です。変数aには値5が入っています。変数bには値7(=5+2)が入っています。

[編集]

ここまでの例では、代数学の「変数」と、プログラミングの「変数」とは、似ているところもありますが違う意味論を持ちます。 Pythonでは変数には文字列のように数値以外とも結びつけること(バインディングすること)ができます[1]。 このため代数学でいう「変数」と、プログラミングでいう「変数」との意味の違いに気をつけてください。

Pythonでは変数には型がなく、変数にバインディング(束縛)されたオブジェクトに型があります[2]

  • 整数型  — 0, 1, 2, -123, 100, 10000
  • 実数型  — 0.0, -12.2, 1.2, 10e19
  • 文字列型  — "", "abc", "かな漢字"
  • リスト型  — [], [1, 2, 3], [1, 2, "a", [34, 89], ]

などがあります。

変数には型がなくオブジェクトに型がある
a = 1
print(a)
a = "XYZ"
print(a)
実行結果
1 
XYZ
変数aの値は、2行目までは 1(整数)でしたが、3行目で "XYZ"(文字列)となっています。
2行目までと3行目以降とでは、変数aにバインディングされたオブジェクトが整数から文字列に変わったことを示しています。
このようにPythonのような動的型付け言語では、変数は「値を入れる箱」ではなく「オブジェクトに(一時的に)つけられた名前、あるいはオブジェクトと名前のペア」です[3]
2つ以上の変数が同じオブジェクトにバインディングされた例
a = []
print(f"{a=}")
b = a
print(f"{a=}, {b=}")
b.append(100)
print(f"{a=}, {b=}")
実行結果
a=[]
a=[], b=[]
a=[100], b=[100]
  1. aに空の配列を代入
  2. aの値をprint ⇒ a= []
  3. bにaを代入
  4. aとbの値をprint ⇒ a= [] , b= []
  5. bの要素に100を追加
  6. aとbの値をprint ⇒ a= [100] , b= [100]  — 変更してのはbなのにaも同じ様に変更されている  — 同じ配列にバインディングされている
f"{a=}, {b=}" は、フォーマット済み文字列リテラルです。変数や式の値を確かめるのに便利です。

代入[編集]

pythonでは「=」記号は、「左辺の識別子に右辺のインスタンスをバインドする」ことを意味します。 数学の等号とはもちろん、静的型付けの言語の代入とも意味が違いますが、Pythonを含む動的型付けな言語ではこれを代入と呼びます。

コード例
a = 3
a = a + 1
print(a)
実行結果
4
1行目のa = 3」によって、まず、aに3が代入されます。
2行目のa = a + 1」では、まず右辺の評価が先に行われるので、変数aの値3が参照され 3+1 が評価され、その結果が左辺に代入されます。よって、aの値が4に置き換わります。

二文字以上の変数名[編集]

変数名はべつに1文字でなくてもかまいません。

コード例
abc = 6
xyz = abc + 4
print(xyz)
実行結果
10
abcxyzが、変数です。

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

変数の名前には、そのプログラムの使い道にもとづいた名前をつけると、わかりやすくなります。

コード例
price = 800
pics = 3
cost = price * pics
print(cost)
変数名から、「単価が800円のモノを3個の値段」と、見ただけで予想がつきます。

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

識別子[編集]

pythonでは、識別子の大文字と小文字とを区別します。 このため、たとえば「print("ABC")」を「PRINT("ABC")」と書くと、エラーになり実行できません。 また、変数名や関数名などの識別子につかえる文字として、英数字とアンダースコア「_」が、識別子として使用できます。 ただし、識別子の先頭の一文字には数字は使えません。

コード例
A = 1
a = 3
print("A=", A)
print("a=", a)
実行結果
A= 1
a= 3
識別子に使えるASCII範囲外の文字
Python3.0からは、識別子にASCII範囲外の文字の一部が使えるようになりました[4]

識別子に使えるコード:

  • 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 - PropList.txt に明示的にリストされた文字
  • Other_ID_Continue - 同上

ASCII範囲外の文字も識別子に使えるようになったものの、表示や編集に支障がある環境のことや正規化に関するトラブルに配慮するなら、識別子はASCIIの範囲内に留めるのが良いでしょう。


キーワード[編集]

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

キーワードの一覧を表示するスクリプト
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

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

ソフト・キーワード(Soft keywords)は、識別子の中で、特定の状況下でのみ予約されるものです[7]。 識別子 match、case、_ は、パターン・マッチング文に関連する文脈では、構文的にキーワードとして機能しますが、この区別はトークン化の際ではなく、パーサー・レベルで行われます。 ソフトキーワードであれば、match、case、_を識別子名として使用している既存のコードとの互換性を保ちつつ、パターン・マッチングで使用することができます。

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

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

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

アトム[編集]

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

識別子(名前)[編集]

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

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

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

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

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

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

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

脚註[編集]

  1. ^ リスト、タプル、辞書については後で取り扱います。
  2. ^ 3.10.0 Documentation » The Python Language Reference » 4. Execution model§4.2. Naming and binding” (2021年11月29日). 2021年11月30日閲覧。
  3. ^ C言語/C++/Javaの様な静的型付け言語では、変数は「値を入れる箱」で変数は名前と一対一なアドレスを持ちます(変数がレジスターに割付けられた場合は例外です。この場合も変数名(=識別子)とオブジェクトの間の一意性はあります)。
  4. ^ PEP 3131 -- Supporting Non-ASCII Identifiers” (2007年5月1日).テンプレート:Cite web/error
  5. ^ keyword — Testing for Python keywords” (2021年11月29日).テンプレート:Cite web/error
  6. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.1. Keywords” (2021年11月29日).テンプレート:Cite web/error
  7. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.2. Soft Keywords” (2021年11月29日).テンプレート:Cite web/error
  8. ^ Reserved classes of identifiersを「予約済み識別子クラス」と訳しました。ここで言うクラスはオブジェクト指向プログラミングでいう Class ではなう階級や種類という一般的普遍的な意味のクラスです。
  9. ^ 3.10.0 Documentation » The Python Language Reference » 2. Lexical analysis§2.3.3. Reserved classes of identifiers” (2021年11月29日).テンプレート:Cite web/error
  10. ^ 3.10.0 Documentation » The Python Language Reference » 6. Expressions§6.2. Atoms” (2021年11月29日).テンプレート:Cite web/error
  11. ^ 3.10.0 Documentation » The Python Language Reference » 6. Expressions§6.2.1. Identifiers (Names)” (2021年11月29日).テンプレート:Cite web/error
  12. ^ 将来のあなたかもしれません。

参考文献[編集]