2016-06-01 7 views
1
>>> servers = ["srv1.usa", "srv1.lnd"] 
>>> proxies = ["proxy1.usa", "proxy1.lnd"] 
>>> proxy_map = {}.fromkeys(servers, {}.fromkeys(proxies, {})) 
>>> print proxy_map 
{'srv1.lnd': {'proxy1.lnd': {}, 'proxy1.usa': {}}, 'srv1.usa': {'proxy1.lnd': {}, 'proxy1.usa': {}}} 
>>> proxy_map["srv1.lnd"]["proxy1.lnd"] = {"hosts": "host1.usa"} 
>>> print proxy_map 
{'srv1.lnd': {'proxy1.lnd': {'hosts': 'host1.usa'}, 'proxy1.usa': {}}, 'srv1.usa': {'proxy1.lnd': {'hosts': 'host1.usa'}, 'proxy1.usa': {}}} 

これは私の質問です。なぜPythonが私が変更したものの代わりに2つの辞書を変更したのですか?申し訳ありませんが、この質問がばかだが、私の場合の答えが見つかりませんでした。ありがとうございました!3レベルの辞書pythonが明白に動作しない

+0

答えが用意されていません。任意の良い説明これはOPが知りたいことです。 –

答えて

4

fromkeysは罠です。それを使用しないでください。

あなたがdict.fromkeysを使用すると、結果の辞書のすべての値が同じオブジェクトです。等しいオブジェクトだけでなく、同じオブジェクトです。あなたがd = dict.fromkeys(keys, val)を行う場合d[key1]d[key2]は同じものですので、あなたがd[key1]に行うものは、d[key2]を通して見えます。値が不変であるとき

dict.fromkeysは通常のみ有用です。残りの時間は、各キーの値式を再評価するためにdictの理解度を使用する必要があります。たとえば、

{key: {} for key in keys} 

dict.fromkeys(keys, {})の代わりに。

+0

ありがとうございました、私が知りたいことでした。 –

0

ソリューションは、辞書の理解を使用することです:

代わりのproxy_map = {}.fromkeys(servers, {}.fromkeys(proxies, {}))

使用

proxy_map = {server : {proxy: {} for proxy in proxies} for server in servers}

コンプリート例:重複する

>>> servers = ["srv1.usa", "srv1.lnd"] 
>>> proxies = ["proxy1.usa", "proxy1.lnd"] 
>>> proxy_map = {server : {proxy: {} for proxy in proxies} for server in servers} 
>>> proxy_map 
{'srv1.usa': {'proxy1.usa': {}, 'proxy1.lnd': {}}, 'srv1.lnd': {'proxy1.usa': {}, 'proxy1.lnd': {}}} 
>>> proxy_map["srv1.lnd"]["proxy1.lnd"] = {"hosts": "host1.usa"} 
>>> proxy_map 
{'srv1.usa': {'proxy1.usa': {}, 'proxy1.lnd': {}}, 'srv1.lnd': {'proxy1.usa': {}, 'proxy1.lnd': {'hosts': 'host1.usa'}}} 
+0

ええ、これです、実際の例に感謝します。 –

+0

正しい答えとして受け入れてください – Erich

関連する問題