Python:将变量名称与变量值分配给字典值

时间:2016-05-22 08:29:14

标签: python dictionary

有人可以解释为什么这两个不同的代码示例会给出不同的输出吗?我很困惑为什么第一个样本在所有月份都附加了“晴天”和“云”,这不是我想要的。我想要第二个样本的输出。但是,我想将变量“forecast”,而不是它的值分配给weatherReport [“months”] [month]。有没有办法以这种方式获得样本2的输出?

样本1:

test

样品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

样本2:

{'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 个答案:

答案 0 :(得分:2)

在第二个代码中,您为每个月分配一个全新的独立列表。因此,当您稍后将值附加到这些列表时,只会附加到正确的列表中。

在第一个代码中,您为每个月分配相同的变量。在Python中,它意味着每个月都有对相同列表的引用。因此,当您向这些列表中的任何一个添加值时,实际上您将其添加到每个月指向的forecast列表中。所以结果。

根本原因是列表是 mutable ,这意味着您可以修改其他对象指向的对象。您将无法使用非可变对象(如字符串)重现该内容。

答案 1 :(得分:1)

在示例1中,您将为dict中的所有值分配相同的引用;因此,当您更改该引用的值时,它将反映在字典中的所有值中。在第二个示例中,每个字典实例都有一个唯一的列表。