| この記事の要点 |
|
代入は「箱に入れる」ではない
Python の = は、右辺のオブジェクトに左辺の名前を結び付ける操作です。値がコピーされるわけではありません。
a = [1, 2, 3]
b = a # 同じリストに別名を付けただけ
b.append(4)
print(a) # [1, 2, 3, 4] ← a も変わる
# 別物にしたいならコピーする
c = a.copy() # または list(a) / a[:]
c.append(5)
print(a, c) # [1, 2, 3, 4] [1, 2, 3, 4, 5]
# 入れ子は copy でも内側が共有される
import copy
d = copy.deepcopy(a) # 完全に独立させたいとき
複合代入の一覧
| 演算子 | 意味 | 例 |
|---|---|---|
+= | 加算 / 連結 | x += 1 |
-= *= | 減算 / 乗算 | x *= 2 |
/= | 除算(float になる) | x /= 2 |
//= %= | 切り捨て除算 / 剰余 | x //= 2 |
**= | べき乗 | x **= 2 |
&= |= ^= | ビット AND / OR / XOR | flags |= MASK |
<<= >>= | シフト | x <<= 1 |
Python には ++ / -- はありません。x += 1 と書きます。x++ は構文エラー、++x は「単項プラスを 2 回」と解釈されて何も起きません。
+= と = x + は同じではない
a = [1, 2]
b = a
a += [3] # その場で拡張(a.extend([3]) と同じ)
print(a, b) # [1, 2, 3] [1, 2, 3] ← b も変わる
a = [1, 2]
b = a
a = a + [3] # 新しいリストを作って a に付け替え
print(a, b) # [1, 2, 3] [1, 2] ← b は元のまま
タプルや文字列のような不変オブジェクトでは、+= も必ず新しいオブジェクトを作るのでこの違いは出ません。
複数代入とアンパック
x = y = 0 # 同じ値を同時に
a, b = 1, 2 # タプルのアンパック
a, b = b, a # 入れ替え(右辺が先に評価される)
print(a, b) # 2 1
first, *rest = [1, 2, 3, 4]
print(first, rest) # 1 [2, 3, 4]
head, *mid, tail = [1, 2, 3, 4, 5]
print(head, mid, tail) # 1 [2, 3, 4] 5
for i, name in enumerate(["a", "b"]):
print(i, name) # 0 a / 1 b
# 使わない値は _ に入れる慣習
_, important = ("捨てる", "使う")
x = y = [] は同じ空リストを 2 つの名前で共有します。別々に使いたいなら x, y = [], [] と書いてください。
セイウチ演算子(:=)
Python 3.8 で入った、式の中で代入するための演算子です。値を使い回したいが、そのために行を増やしたくないときに使います。
# 読み込みながら終端を判定する
with open("data.txt") as f:
while (line := f.readline()):
print(line.rstrip())
# 計算結果を条件と本体の両方で使う
data = [1, 2, 3, 4, 5]
if (n := len(data)) > 3:
print(f"{n} 件は多い")
# 内包表記で中間結果を再利用する
words = ["apple", "kiwi", "banana"]
long_upper = [u for w in words if len(u := w.upper()) > 4]
print(long_upper) # ['APPLE', 'BANANA']
括弧が必要な場面が多く、読みにくくなりがちです。同じ値を 2 回書くのを避けられるときだけ使うのが無難です。
グローバル変数への代入
count = 0
def bad():
# count += 1
# UnboundLocalError: 関数内で代入があると全体がローカル扱いになる
pass
def good():
global count
count += 1
good()
print(count) # 1
入れ子関数で外側のローカル変数に代入したい場合は nonlocal を使います。ただし、どちらも多用すると追いにくくなるため、値を返す設計にできないか先に検討してください。
関連
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38