Python字典替换值

时间:2019-05-13 12:48:01

标签: python

我正在尝试在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'}}

2 个答案:

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