Pythonのlistをcopyしないと、for文で無限ループに入る

先日Pythonでlistの要素についてfor文を回したところ、無限ループに入ってしまいました。Pythonの仕様について、基礎的なことですが知らなかったので反省の意をこめて記事にします。

起きたこと

簡単なコードになおすと以下のようなことがおきました。

1
2
3
4
5
A=[]
B=A

for i in B:
    A.append(2)

これでBに無限に2が代入され、終わらなくなってしまいました。Aに代入しているのにどうして…

調べてわかったこと

「Python 参照渡し」で調べれば詳しい情報は多数でてくるかと思います。簡潔に述べると、B=Aと書くとこの二つは同じオブジェクトを示すことになり、つまり呼び方が違うだけで一緒のオブジェクトについて話してることになるということです。

解決方法

コピーして違うオブジェクトして使いたいときは、.copyなどを使います。

1
2
3
4
5
A=[]
B=A.copy()

for i in B:
    A.append(2)

これで無限ループにならず望んだ挙動になりました。

おわり

Pythonに参照渡しという言葉があるのは知っていたので、これが噂の…?と調べることができました。知っててよかったね。