Python:在dict中写一个项目,但一切都受影响

时间:2019-12-08 13:20:55

标签: python python-3.x dictionary

我想更改词典中的单个项目,但事实证明每个项目都已更改。

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

1 个答案:

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