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'}}}
>>> 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'}}}