変数への代入と式の評価順序
商品価格と個数から合計を計算し、個数を変えた後の合計を確認します。続いて値の交換を試し、実行順によって何が失われるかを確かめます。
説明
変数は値を参照するための名前です。代入では右辺を先に計算し、その結果を左辺の名前へ結び付けます。式を保存して後から自動更新する操作ではありません。
商品価格と個数から合計を計算し、個数を変えた後の合計を確認します。続いて値の交換を試し、実行順によって何が失われるかを確かめます。
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
price = 120; quantity = 3; print(price, quantity)120 3
total = price * quantity; total360
quantity = 5; print(quantity, total)5 360
total = price * quantity; print(total, total == 600)600 True
snapshot = price; price = 150; print(price, snapshot, 'price', '# price = 0') # price = 0150 120 price # price = 0
a = 3; b = 7; a = b; b = a; print(a, b)7 7
a = 3; b = 7; temp = a; a = b; b = temp; print(a, b, temp)7 3 3
a = 3; b = 7; a, b = b, a; print(a, b)7 3
演習完了