🌟

【Python】複数の空のリストを同時に作成する時の注意点

2022/05/11に公開

複数の空のリストを同時に作成する時のダメな書き方

複数の空のリストを作成する際にこんな感じで書くと、おそらく想定通りの動作をしません。

a_lst = b_lst = []



試してみるとわかりますが、このような結果となります。

a_lst = b_lst = []
a_lst.append(1)
b_lst.append(2)
print(a_lst)
# [1, 2]



ちなみに変数だとうまくいきます。

a = b = 0
a = 1
b = 2
print(a)
# 1


なぜか?

結論から言うと、Pythonでは全てオブジェクトで管理されており、リストにappendしてもリストのオブジェクトIDが更新されないからです。

詳しく見ていきましょう。
先ほどのダメな書き方のリストのIDを確認します。IDは id() で確認できます。

a_lst = b_lst = []
print(f"a_lst: {id(a_lst)}")
print(f"b_lst: {id(b_lst)}")
print()
a_lst.append(1)
b_lst.append(2)
print(f"a_lst: {id(a_lst)}")
print(f"b_lst: {id(b_lst)}")
# a_lst: 140464259535360
# b_lst: 140464259535360
#
# a_lst: 140464259535360
# b_lst: 140464259535360

a_lstとb_lstが同じIDで、append後もリストのIDが変わっていないことがわかると思います。


対して変数の方は、初期化後のIDが同じ事は変わらないのですが、数値を代入後の変数のIDは更新されており、別々のオブジェクトとなっていることがわかります。

a = b = 0
print(f"a: {id(a)}")
print(f"b: {id(b)}")
print()
a = 1
b = 2
print(f"a: {id(a)}")
print(f"b: {id(b)}")
# a: 140464221251856
# b: 140464221251856
#
# a: 140464221251888
# b: 140464221251920



実はPythonでは数値もオブジェクトで管理されており、変数aと変数bには数値1と数値2のオブジェクトが代入されています。

print(id(1))
print(id(2))
# 140464221251888
# 140464221251920


ではどう書けばよいか?

正解はわかりませんが(誰か教えて)、一行で書きたい場合は以下のようにすると別々のオブジェクトとして生成されるようです。

a_lst, b_lst = [], []
print(id(a_lst))
print(id(b_lst))
a_lst.append(1)
b_lst.append(2)
print(a_lst)
# 140464259506240
# 140464259441792
# [1]


あとがき

なんか変な動作をするな、と思って数分間悩んだので記事にしました。
この記事が役に立った方は「いいね」いただけると嬉しいです。
間違っている箇所がありましたらコメントいただけますと幸いです。

Discussion