以下のような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で検証しました.