2016-05-22 260 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中,您将为字典中的所有值分配相同的引用;因此,当您更改该引用的值时,它会反映在字典中的所有值中。在第二个示例中,每个字典实例都有唯一的列表。