みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Pythonのリスト内包表記内で同じ名前の変数を使う

以下のようなPythonスクリプトを見かけました.

a = [1, 2, 3, 4, 5]
a = [a*2 for a in a]
print(a)

最初に宣言した変数aと同じ名前の変数aをリスト内包表記内で使用しています.

初めて見た時は意味がわからなかったのですが,問題なく動作します.

[2, 4, 6, 8, 10]

Pythonのリスト内包表記内はスコープが別になるので,リスト内包表記内の変数aと,外の変数aがそれぞれ独立して存在するわけです.

この事実を示すために,以下のスクリプトを実行してみます.

a = [1, 2, 3, 4, 5]
[print(a*2) for a in a]
print(a)

実行すると,リスト内包表記内の変数aの様子が分かりますし,外の変数aの中身は変わっていないことが分かります.

2
4
6
8
10
[1, 2, 3, 4, 5]

とはいうものの読みやすいように普通に書いてほしいと思いました.

a = [1, 2, 3, 4, 5]
b = [i*2 for i in a]
print(b)

MacOS 10.15.7 の Python 3.8.8で検証しました.