3 级词典 python 不明显

3 level dictionary python doesn't work obvious

>>> 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 改了两部词典,而不是我改的一部?抱歉,如果这个问题很愚蠢,但我没有找到适合我的案例的答案。谢谢!

fromkeys是一个陷阱。不要使用它。

当你使用dict.fromkeys时,结果字典的所有值都是同一个对象。不仅仅是相等的对象——它们是同一个对象。如果你做 d = dict.fromkeys(keys, val),你对 d[key1] 所做的任何事情都会通过 d[key2] 可见,因为 d[key1]d[key2] 是同一件事。

dict.fromkeys 通常仅在值不可变时才有用。其余时间,您应该使用字典理解来重新评估每个键的值表达式。例如,

{key: {} for key in keys}

而不是 dict.fromkeys(keys, {})

解决方案是使用字典理解:

而不是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'}}}