[英]Can anyone explain the output of the following code?
在練習列表和字典時,我嘗試了以下代碼,但不了解其輸出。 你能解釋一下嗎?
list1 = []
json1 = {
"key1": "",
"key2": ""
}
json1['key2'] = 'value2'
list2 = ["list_item_1", "list_item2"]
for item in list2:
json1['key1'] = item
list1.append(json1)
print list1
我得到的輸出是這樣的:
[{'key2': 'value2', 'key1': 'list_item2'}, {'key2': 'value2', 'key1': 'list_item2'}]
根據我的理解,輸出應該是
[{'key2': 'value2', 'key1': 'list_item1'}, {'key2': 'value2', 'key1': 'list_item2'}]
要么
[{'key2': 'value2', 'key1': 'list_item2'}, {'key2': 'value2', 'key1': 'list_item1'}]
我的理解在某處是錯誤的,但我想知道什么是錯誤的。 我在Windows 10平台上使用python 2.7.13 64位。
如果您能告訴我輸出之間差異的原因,那就太好了。
謝謝!
當你做
list1.append(json1)
您將對象json1
附加到list1
。 在該循環的下一個迭代中,您更改json1
,然后將其再次附加到list1
。 請注意,您已經兩次將相同的對象添加到循環中,只是在這兩者之間更改了該對象的屬性。
因此,當您打印列表時,它將打印同一對象兩次。 為了避免這種情況的發生,你需要一個獨立的,但相同的副本添加json1
到您的list1
(這樣,當你以后修改原來的列表,你不改變,你已經添加到列表中的副本)。 您可以使用dict.copy()
方法執行此操作:
for item in list2:
json1['key1'] = item
list1.append(json1.copy())
我懷疑您對此行的誤解是:
list1.append(json1)
這會將對象 json1
追加到list
; 您似乎希望它拍攝json1
當前值的快照並將其副本放入list1
。 如果您想要那種效果,請使用
list1.append(copy(json1))
但是,這只會復制json1
; 如果字典包含對象,則需要import copy
,然后使用copy.deepcopy(json1)
。
這有助於清除您的理解,還是使其變得更加復雜?
問題是您不了解變量如何在python中工作。 在python中, 一切都是對象,所有變量都是指向值的指針。 這意味着當你做
x = []
y = x
變量x
和y
指向相同的列表對象。 我可以通過執行驗證
x is y # True
如果我願意
x.append("foo")
y.append("bar")
print "x:", x
print "y:", y
輸出為:
x: ["foo", "bar"]
y: ["foo", "bar"]
因為x
和y
指向相同的列表。
同樣的事情發生在您的代碼中。
當您執行list1.append(json1)
, json1
指向一個字典,並且其值永不更改(您永不執行json1 = ...
),因此結果是同一字典兩次被追加到列表中,並且所有更改對該詞典進行的更改將反映在兩個列表元素中。
為了獲得預期的結果,您需要復制json1
的字典並將副本附加到列表中。 將list1.append(json1)
行替換為list1.append(dict(json1))
將得到預期的結果,因為dict()
創建了該字典的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.