LoginSignup
2
0

More than 3 years have passed since last update.

[Python]リスト内包表記を使おうとして、小一時間ハマった

Posted at

はじめに

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]

終わりに

記事を書いた後に調べたら、先人の知恵が既にありました。。。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0