def purify(ls):
y = ls
for i in ls:
if i % 2 != 0:
y = y.remove(i)
print y
リスト(4,5,5,4)を渡すと、次のコードは失敗します。 (4、4)の代わりに(4、5、4)を返します。ここで何が間違っていますか?私はyリストの変更が元のリストlsに影響を与える理由を理解できません。リストから奇数を削除する
def purify(ls):
y = ls
for i in ls:
if i % 2 != 0:
y = y.remove(i)
print y
リスト(4,5,5,4)を渡すと、次のコードは失敗します。 (4、4)の代わりに(4、5、4)を返します。ここで何が間違っていますか?私はyリストの変更が元のリストlsに影響を与える理由を理解できません。リストから奇数を削除する
このようにします。
In [1]: a = (4, 5, 5, 4)
In [2]: result = [i for i in a if not i % 2]
In [3]: result
Out[1]: [4, 4]
In機能です。私はこれがあなたはそれが仕事だ方法を理解することができ、私のcode.Fromを拡大し、より理解するために
def purify(ls):
return [i for i in ls if not i % 2]
。
def purify(input_list):
result = []
for i in input_list:
if not i % 2:
result.append(i)
return result
アイテムの削除を開始すると、インデックスが変更されます。ループ内で項目を変更している間は、リストを反復するのは良い方法ではありません。
def purify(ls):
for i in ls[:]:
if i % 2 != 0:
ls.remove(i)
それとも、リストの内包表記を使用します:代わりにリストls[:]
のスライスに反復し、次のコード
[i for i in ls if i % 2 == 0]
理解することが非常にクリーンかつ簡単です:
l = [4, 5, 5, 4]
l = filter(lambda x: x % 2 == 0, l)
print(l)
[4, 4]
remove(...)
L.remove(value) -- remove first occurrence of value.
Raises ValueError if the value is not present.
正しいバージョン:
>>> filter(lambda x: x % 2 == 0, [4, 5, 5, 4])
[4, 4]
あなたの正しいバージョン:
def purify(ls):
y = ls[:] # copy it instead of refering to it
for i in ls:
if i % 2 != 0:
y.remove(i) # remove will return none
print y
しかし、私は元のリストのLSリストyを編集していません。私はyリストの関数が元のリストlsに影響している理由を理解できません。 –
2つの変数が同じオブジェクトを指しています。したがって、 'x = y = ['a']'と 'x [0] = 4'を実行すると、' y'も更新されます。 –