はじめに
Pythonの勉強中で、リスト内包表記を使ってみようと思ったら、小一時間ハマりました。
Pythonの関数は参照渡しだと思ってしまったのが原因だと思います。
(筆者が「参照渡し」を誤解しているかもしれないですが)
実行結果を見比べれば、何が起きたか分かります、きっと。
ハマったコードと実行結果
冒頭の関数findDiff()
を作って、追加要素と削除要素を調べようとしました。
しかし、関数から戻ったら、リストの要素が消え(たように見え)ました。
def findDiff(oldList, newList, adds, dels):
adds = [x for x in newList if oldList.count(x) < 1]
dels = [x for x in oldList if newList.count(x) < 1]
oldList = [1,2,3,5,6,7,8,9]
newList = [1,2,4,5,6,7,8,10]
adds = []
dels = []
print(adds)
print(dels)
findDiff(oldList, newList, adds, dels)
print(adds)
print(dels)
#>>> []
#>>> []
#>>> []
#>>> []
修正したコードと実行結果
冒頭の関数findDiff()
のみ、修正しています。
def findDiff(oldList, newList, adds, dels):
for x in newList:
if oldList.count(x) < 1:
adds.append(x)
for x in oldList:
if newList.count(x) < 1:
dels.append(x)
oldList = [1,2,3,5,6,7,8,9]
newList = [1,2,4,5,6,7,8,10]
adds = []
dels = []
print(adds)
print(dels)
findDiff(oldList, newList, adds, dels)
print(adds)
print(dels)
#>>> []
#>>> []
#>>> [4, 10]
#>>> [3, 9]
終わりに
記事を書いた後に調べたら、先人の知恵が既にありました。。。