2017-11-03 24 views
-6

私はチュートリアルをしていますが、わかりません。辞書(項目)を更新しますが、メインリスト(項目)も更新される理由はわかりません。リスト/ディクショナリの更新はありますが、理由はわかりません

ラムダ関数またはを使ってリストをフィルタリングするのと同じことです。

私に説明できますか?前もって感謝します。あなたのitem

items = [{'name': 'toto', 'price': 99}] 

name = 'toto' 

#item = next(filter(lambda x: x['name'] == name, items), None) 

for x in items: 
    if x['name'] == name: 
     item = x 
    else: 
     item = None 


print(item) 
if item is None: 
    item = {'name': name, 'price': 77} 
    items.append(item) 
else: 
    item.update({'price': 100}) 
print(item) 
print(items) 

答えて

0

はNoneではないので、else節は辞書を更新します。

if item is None: 
    item = {'name': name, 'price': 77} 
    items.append(item) 
else: 
    item.update({'price': 100}) 

あなたのリストは、その中に単一の要素、辞書を持っています。あなたがリストを反復処理するとき、あなたはあなたの要素への参照を取得します。辞書は変更可能ですので、変更することができます。

次に、項目はダクトオブジェクト(リスト内の唯一の要素)を参照します。それを更新すると内容が変更されます。あなたは同じ要素を項目とあなたのリストのポイントを見ることができます:

id(item) == id(items[0])

それは同じオブジェクトである、したがって、あなたがそれを変更したとき - あなたのリストの項目も変更されます。

+0

こんにちは。あなたの答えをありがとう。私は自分のアイテムがNoneではないことを知っています。 item.updateという行がなぜ "items"というリストも更新する理由がわかりません。ありがとう。 – Koko

+0

@ココ見えます。私は自分の答えを更新しました。あなたがこれをよく理解するのに役立つかどうかを見てください。 – Vinny

+0

更新された答えをありがとう。これはいつものケースですか? 「アイテム」を更新せずに更新できる新しい変数「アイテム」をどのように作成できるか知っていますか? – Koko

関連する問題