2016-05-22 257 views
0

有人可以解釋爲什麼這兩個不同的代碼示例給出不同的輸出?我對第一個樣本爲何會在所有月份附加「陽光」和「雲朵」感到困惑,這不是我想要的。我想要第二個樣本的輸出。但是,我想將變量「forecast」分配給weatherReport [「months」] [month],而不是其值。有沒有辦法以這種方式獲得Sample 2的輸出?Python:將變量名稱與變量值分配到字典值

樣品1:

weatherReport = {"months": {}} 


forecast = [] 

months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] 

for month in months[1:]: 
    weatherReport["months"][month] = forecast 

weatherReport["months"]["June"].append("sunny") 
weatherReport["months"]["December"].append("cloudy") 

print weatherReport 

輸出爲樣品1:

{'months': {'February': ['sunny', 'cloudy'], 'October': ['sunny', 'cloudy'], 'March': ['sunny', 'cloudy'], 'August': ['sunny', 'cloudy'], 'May': ['sunny', 'cloudy'], 'December': ['sunny', 'cloudy'], 'June': ['sunny', 'cloudy'], 'September': ['sunny', 'cloudy'], 'April': ['sunny', 'cloudy'], 'July': ['sunny', 'cloudy'], 'November': ['sunny', 'cloudy']}} 

樣品2:

weatherReport = {"months": {}} 


forecast = [] 

months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] 

for month in months[1:]: 
    weatherReport["months"][month] = [] 


weatherReport["months"]["June"].append("sunny") 
weatherReport["months"]["December"].append("cloudy") 

print weatherReport 

輸出爲樣品2:

{'months': {'February': [], 'October': [], 'March': [], 'August': [], 'May': [], 'December': ['cloudy'], 'June': ['sunny'], 'September': [], 'April': [], 'July': [], 'November': []}} 

回答

2

在第二個代碼中,您爲每個月分配一個全新的獨立清單。因此,當您稍後將值附加到這些列表時,您只能附加到正確的列表。

在第一個代碼中,您爲每個月分配相同的變量。在Python中,它意味着每個月都有對同一列表的引用。因此,當您向任何列表中添加值時,實際上您將其添加到每月指向的forecast列表中。所以結果。

在引擎蓋下,原因是列表是mutable,這意味着您可以修改其他對象指向的對象。您將無法使用字符串等非可變對象重現該問題。

+0

我明白了。有沒有其他方式獲得與第二代碼相同的解決方案,還是唯一的方法? – user3226932

+0

@ user3226932列表複製:預測[:]並且您沒有參考,但是有副本。 – palsch

1

在示例1中,您將爲字典中的所有值分配相同的引用;因此,當您更改該引用的值時,它會反映在字典中的所有值中。在第二個示例中,每個字典實例都有唯一的列表。