我正在尝试在python中测试字典。
第一种初始化方式有效,而第二种方式替换值。我不懂为什么。
#!/usr/bin/env python
BASIC_SCHEME = {'name': None}
workload_names=['a', 'b']
WORKLOAD_STRUCT ={k: {} for k in workload_names}
print ("without initialisation ", WORKLOAD_STRUCT)
WORKLOAD_STRUCT['a']['name'] = 'a'
WORKLOAD_STRUCT['b']['name'] = 'b'
print(WORKLOAD_STRUCT)
WORKLOAD_STRUCT = None
WORKLOAD_STRUCT ={k: BASIC_SCHEME for k in workload_names}
print ("with initialisation ", WORKLOAD_STRUCT)
WORKLOAD_STRUCT['a']['name'] = 'a'
WORKLOAD_STRUCT['b']['name'] = 'b'
print(WORKLOAD_STRUCT)
这是我的控制台的结果。
python test.py
without initialisation {'a': {}, 'b': {}}
{'a': {'name': 'a'}, 'b': {'name': 'b'}}
with initialisation {'a': {'name': None}, 'b': {'name': None}}
{'a': {'name': 'b'}, 'b': {'name': 'b'}}
答案 0 :(得分:2)
您的第二种方法创建了一个引用字典,这些引用都指向同一对象,即BASIC_SCHEME
。您想要的是每次创建一个新的字典对象。您可以为此使用.copy()
:
WORKLOAD_STRUCT ={k: BASIC_SCHEME.copy() for k in workload_names}
您应该意识到的一些相关概念:
答案 1 :(得分:1)
如果BASIC_SCHEME
,则第二个实例WORKLOAD_STRUCT
中的WORKLOAD_STRUCT
仍指向第一个实例,因此,您想要做的是复制BASIC_SCHEME
的副本您可以在这里dict(BASIC_SCHEME)
BASIC_SCHEME = {'name': None}
workload_names=['a', 'b']
WORKLOAD_STRUCT ={k: {} for k in workload_names}
print ("without initialisation ", WORKLOAD_STRUCT)
WORKLOAD_STRUCT['a']['name'] = 'a'
WORKLOAD_STRUCT['b']['name'] = 'b'
print(WORKLOAD_STRUCT)
#Copy of BASIC_SCHEME
WORKLOAD_STRUCT ={k: dict(BASIC_SCHEME) for k in workload_names}
print ("with initialisation ", WORKLOAD_STRUCT)
WORKLOAD_STRUCT['a']['name'] = 'a'
WORKLOAD_STRUCT['b']['name'] = 'b'
print(WORKLOAD_STRUCT)
输出将为
without initialisation {'a': {}, 'b': {}}
{'a': {'name': 'a'}, 'b': {'name': 'b'}}
with initialisation {'a': {'name': None}, 'b': {'name': None}}
{'a': {'name': 'a'}, 'b': {'name': 'b'}}