Python:在dict中编写一个条目,但所有内容都会受到影响

2024-06-25 06:20:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更改字典中的一个条目,但结果是每个条目都更改了。你知道吗

假设有一个文件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']}}}

Tags: cmdidcachedatabytypecountchat
1条回答
网友
1楼 · 发布于 2024-06-25 06:20:09

问题是您只有一个empty_datadict实例,可以在不同的地方更新。你知道吗

当你做data = empty_data的时候,你只需要让名字data引用empty_data已经引用过的dict,你不需要复制它。所以,在所有放置这个data的地方,实际上都放了相同的dict

你每次都需要单独的新字典。你知道吗

一种方法是让函数在需要时为您创建一个新函数:

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': []}}}

相关问题 更多 >