簡體   English   中英

誰能解釋以下代碼的輸出?

[英]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

變量xy指向相同的列表對象。 我可以通過執行驗證

x is y  # True

如果我願意

x.append("foo")
y.append("bar")
print "x:", x
print "y:", y

輸出為:

x: ["foo", "bar"]
y: ["foo", "bar"]

因為xy指向相同的列表。

同樣的事情發生在您的代碼中。
當您執行list1.append(json1)json1指向一個字典,並且其值永不更改(您永不執行json1 = ... ),因此結果是同一字典兩次被追加到列表中,並且所有更改對該詞典進行的更改將反映在兩個列表元素中。

為了獲得預期的結果,您需要復制json1的字典並將副本附加到列表中。 list1.append(json1)行替換為list1.append(dict(json1))將得到預期的結果,因為dict()創建了該字典的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM