yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

pythonのlistは代入しただけでは変更の巻き添えを食らうからcopyで複製する

2020-01-05

タイトルだけでは意味がわからないと思うので実際のコードを見てみる

% cat listtest_20190105.py
#!/usr/bin/env python
# coding: utf-8

list1 = ['aaa','bbb','ccc','ddd','eee']

list2 = list1

list2.remove('ccc')

print('list1: %s' % list1)
print('list2: %s' % list2)

このコードの実行結果は以下

% python listtest_20190105.py
list1: ['aaa', 'bbb', 'ddd', 'eee']
list2: ['aaa', 'bbb', 'ddd', 'eee']
list2 = list1

の時点でlist1とは独立したlist2と言うリストができていると思ったが、
list2を変更(remove)したらlist1も巻き添えを食らって変更されていた

という問題

巻き添えを食らいたくないときはcopyを使えば良い

list2 = copy.copy(list1)

list2を変更しても、list1は影響を受けない

% cat listtest_20190105_2.py
#!/usr/bin/env python
# coding: utf-8

import copy # ★ここ

list1 = ['aaa','bbb','ccc','ddd','eee']

list2 = copy.copy(list1) # ★ここ

list2.remove('ccc')

print('list1: %s' % list1)
print('list2: %s' % list2)

実行結果

% python listtest_20190105_2.py
list1: ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
list2: ['aaa', 'bbb', 'ddd', 'eee']