2016-05-22 16 views
0

これら2つの異なるコードサンプルが異なる出力を与える理由を誰かが説明できますか?私はなぜ最初のサンプルがすべての月に「晴れ」と「雲」を追加するのか混乱しています。これは私が望むものではありません。 2番目のサンプルの出力が必要です。しかし、weatherReport ["months"] [month]にその値ではなく、変数 "forecast"を割り当てたいと思います。このようにサンプル2の出力を得る方法はありますか?Python:変数名と変数値をディクショナリ値に代入

サンプル1:サンプル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 

出力:

{'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:サンプル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 

出力:

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

答えて

2

2番目のコードでは、毎月新しい独立したリストを割り当てます。したがって、後でこれらのリストに値を追加すると、適切なリストにのみ追加されます。

最初のコードでは、同じ変数を各月に割り当てます。 Pythonでは、毎月同じリストへの参照があることを意味します。したがって、これらのリストのいずれかに値を追加すると、実際には月ごとに指すリストのforecastに追加されます。だから結果。

に変更可能なので、他のオブジェクトが指し示すオブジェクトを変更することができます。文字列のような可変ではないオブジェクトでは、それを再現することはできません。

+0

です。 2番目のコードと同じ解決策を得る他の方法はありますか、それとも唯一の方法ですか? – user3226932

+0

@ user3226932リストのコピー:forecast [:]と参照がなく、コピーがありません。 – palsch

1

サンプル1では、dictのすべての値に同じ参照を割り当てています。したがって、その参照の値を変更すると、辞書のすべての値に反映されます。 2番目のサンプルでは、​​ディクショナリインスタンスごとに固有のリストがあります。

関連する問題