2016-06-16 18 views
-3
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に影響を与える理由を理解できません。リストから奇数を削除する

答えて

1

このようにします。

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 
1

アイテムの削除を開始すると、インデックスが変更されます。ループ内で項目を変更している間は、リストを反復するのは良い方法ではありません。

def purify(ls): 
    for i in ls[:]: 
     if i % 2 != 0: 
      ls.remove(i) 

それとも、リストの内包表記を使用します:代わりにリストls[:]スライスに反復し、次のコード

[i for i in ls if i % 2 == 0] 
+0

しかし、私は元のリストのLSリストyを編集していません。私はyリストの関数が元のリストlsに影響している理由を理解できません。 –

+0

2つの変数が同じオブジェクトを指しています。したがって、 'x = y = ['a']'と 'x [0] = 4'を実行すると、' y'も更新されます。 –

0

理解することが非常にクリーンかつ簡単です:

l = [4, 5, 5, 4] 

l = filter(lambda x: x % 2 == 0, l) 

print(l) 

[4, 4]

0
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 
関連する問題