一覧PG-01-1 · 変数と式の評価

変数への代入と式の評価順序

商品価格と個数から合計を計算し、個数を変えた後の合計を確認します。続いて値の交換を試し、実行順によって何が失われるかを確かめます。

説明

変数は値を参照するための名前です。代入では右辺を先に計算し、その結果を左辺の名前へ結び付けます。式を保存して後から自動更新する操作ではありません。

商品価格と個数から合計を計算し、個数を変えた後の合計を確認します。続いて値の交換を試し、実行順によって何が失われるかを確かめます。

1価格と個数を用意

priceを120円、quantityを3個として初期化します。整数120や3のように、値を直接書く表記をリテラルと呼びます。

price = 120価格を代入; quantity = 3個数を代入; print(price, quantity)現在値を表示

=は等しいかを調べる比較ではなく代入です。セミコロンで同じ行に文を並べています。printは今の値を表示するための呼出しです。

2合計を計算して保持

右辺のprice * quantityを計算し、totalへ代入します。

total = price * quantity価格×個数の結果を代入; total合計を参照

360がtotalに結び付きます。最後のtotalは名前を参照する式で、対話環境はその結果を表示します。代入文そのものに表示の機能があるわけではありません。

3個数だけを変更

quantityを5へ変更した直後に、quantityとtotalを並べます。

quantity = 5個数を再代入; print(quantity, total)以前の合計も表示

quantityは5ですがtotalは360のままです。totalに入っているのは以前の計算結果であり、priceとquantityを監視して再計算する式ではありません。

4同じ式を再実行

今のquantityで計算し直します。

total = price * quantity変更後の個数で再計算; print(total, total == 600)値と比較結果を表示

合計が600へ更新され、比較式total == 600はTrueになります。代入の=と比較の==は、使う記号も結果も異なります。

5名前と文字列の違い

同じ綴りのpriceを、引用符の有無で比較します。別名のsnapshotにも現在の整数を持たせ、priceを変更します。

snapshot = price変更前の整数を別名でも参照; price = 150価格を再代入; print(price, snapshot, 'price', '# price = 0')値と文字列を表示 # price = 0実行しないコメント

priceは150、snapshotは120です。整数の再代入ではsnapshotまで変更されません。引用符内のpriceや#は文字で、引用符外の#以降はコメントなのでprice = 0は実行されません。

6順番に代入すると元の値が失われる

a=3、b=7を交換したい場面です。まずaへbを代入し、その後bへaを代入してみます。

a = 3; b = 7初期値; a = b; b = a順に上書き; print(a, b)交換できたか確認

両方7になりました。a = bを実行した時点でaは7なので、次のb = aでも7を使います。交換に必要な元の3を参照する名前がなくなっています。

7一時変数へ元の値を残す

同じ初期値から、aの元の値をtempに残して交換します。

a = 3; b = 7初期値へ戻す; temp = a元のaを保持; a = b; b = temp残した値を使って交換; print(a, b, temp)各値を確認

a=7、b=3へ交換できました。tempが元の3を保持しているため、aを上書きしてもbへ渡す値が残っています。

8右辺をまとめて評価する代入

Pythonでは複数の値をまとめて代入できます。同じ初期値からa, b = b, aを実行します。

a = 3; b = 7同じ初期値; a, b = b, a右辺を先に評価して交換; print(a, b)交換後の値

右辺のb, aは代入前の7, 3として評価され、その後に左辺へ割り当てられます。先ほどのa = b; b = aとは評価する順序が違います。名前は大文字・小文字も区別するため、Aはここで作ったaとは別です。

まとめ

代入はその時点の右辺の値を使い、後から自動で再計算しません。

上書き前の値が必要なら保持するか、右辺をまとめて評価する代入を使います。

操作履歴と解説を振り返れます。

Python 3

1
price = 120; quantity = 3; print(price, quantity)
120 3
2
total = price * quantity; total
360
3
quantity = 5; print(quantity, total)
5 360
4
total = price * quantity; print(total, total == 600)
600 True
5
snapshot = price; price = 150; print(price, snapshot, 'price', '# price = 0') # price = 0
150 120 price # price = 0
6
a = 3; b = 7; a = b; b = a; print(a, b)
7 7
7
a = 3; b = 7; temp = a; a = b; b = temp; print(a, b, temp)
7 3 3
8
a = 3; b = 7; a, b = b, a; print(a, b)
7 3

演習完了