我想更改词典中的单个项目,但事实证明每个项目都已更改。
说有一个文件cache.py
:
database = {}
和main.py
在同一目录中:
import cache
empty_data = {
'chat_id': 0,
'receive': {
'count': 0,
'msg_by': [],
'cmd_by': [],
},
}
def write_data(chat_id, user_id, msg_type):
if chat_id in cache.database:
data = cache.database[chat_id]
else:
data = empty_data
data['chat_id'] = chat_id
data['receive']['count'] += 1
if 'message' in msg_type or 'msg' in msg_type:
data['receive']['msg_by'].append(user_id)
else:
data['receive']['cmd_by'].append(user_id)
cache.database[chat_id] = data
print(cache.database)
然后执行以下操作:write_data(10001, 'Amy', 'msg')
它打印出:{10001: {'chat_id': 10001, 'receive': {'count': 1, 'msg_by': ['Amy'], 'cmd_by': []}}}
,看起来很正常。
但是在那之后,如果执行了另一个命令write_data(10002, 'Bob', 'cmd')
,结果是:
{10001: {'chat_id': 10002, 'receive': {'count': 2, 'msg_by': ['Amy'], 'cmd_by': ['Bob']}}, 10002: {'chat_id': 10002, 'receive': {'count': 2, 'msg_by': ['Amy'], 'cmd_by': ['Bob']}}}
但是应该是:
{10001: {'chat_id': 10001, 'receive': {'count': 1, 'msg_by': ['Amy'], 'cmd_by': []}}, 10002: {'chat_id': 10002, 'receive': {'count': 1, 'msg_by': [], 'cmd_by': ['Bob']}}}
答案 0 :(得分:1)
问题是您只有empty_data
字典的一个实例,并且在不同的位置进行更新。
当您执行data = empty_data
时,只需将名称data
引用到empty_data
已经引用的字典,就不会复制它。因此,在放置此data
的所有地方,实际上都放置了相同的字典。
您每次都需要单独的新字典。
一种方法是使一个函数在需要时为您创建一个新函数:
database = {}
def get_empty_data():
empty_data = {
'chat_id': 0,
'receive': {
'count': 0,
'msg_by': [],
'cmd_by': [],
},
}
return empty_data
def write_data(chat_id, user_id, msg_type):
if chat_id in database:
data = database[chat_id]
else:
data = get_empty_data()
data['chat_id'] = chat_id
data['receive']['count'] += 1
if 'message' in msg_type or 'msg' in msg_type:
data['receive']['msg_by'].append(user_id)
else:
data['receive']['cmd_by'].append(user_id)
database[chat_id] = data
print(database)
write_data(10001, 'Amy', 'msg')
write_data(10002, 'Bob', 'msg')
输出:
{10001: {'chat_id': 10001, 'receive': {'count': 1, 'msg_by': ['Amy'], 'cmd_by': []}}}
{10001: {'chat_id': 10001, 'receive': {'count': 1, 'msg_by': ['Amy'], 'cmd_by': []}},
10002: {'chat_id': 10002, 'receive': {'count': 1, 'msg_by': ['Bob'], 'cmd_by': []}}}