首页 > 解决方案 > 在 Dict 上运行 del 命令会随机导致“del TypeError: 'tuple' object doesn't support item删除”

问题描述

此错误随机发生,但不是第一次发生。这是一个字典,所以我不知道它何时或为什么转换为元组。

即使我在检查它是否给出 TypeError 时进行调试,我也会检查数据类型并显示“Dict”。

这是给我带来问题的行:

del db_backup[name][n]

以下是程序中引用 db_backup 的其他时间:


# Global initiliaztion
db_backup = {}

def init():
    global db_backup
...
    db_backup = load_database()
...

def load_database():
    try:
        with open('persons_db.json', 'r') as fp:
            return json.load(fp)

sync_db(i, rs):
...
    person_id_list = db_backup[name]
...
    person_data[i].set_p_id(int(db_backup[name][n+1]))
... 
    del db_backup[name][n]  <-- Trouble line

def backup_db(name, rs):
    key = create_db_key(name, rs)
    db_backup.update(key)
    with open('person_db.json', 'w') as fp:
        json.dump(db_backup, fp, indent=2)

def create_db_key(name, rs):
    key = {}
    key.update({name: (rs[0].id_str, rs[1].id_str, rs[2].id_str, r[3].id_str)})
    return key 

标签: python

解决方案


正如我们在文档中看到的tuples 是不可变的

>>> t = 12345, 54321, 'hello!'

...

>>> # Tuples are immutable:
... t[0] = 88888
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # but they can contain mutable objects:
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])

但是它可以包含可变对象作为lists,因此如果您需要删除一个元素,您可以list在您的内部使用 a tuple,或list直接使用

例如:

rs_list = [rs[0].id_str, rs[1].id_str, rs[2].id_str, r[3].id_str]
key.update({name: (rs_list)})

# or 


key.update({name: rs_list})

如果出于向后兼容性的原因无法使用 a list,并且您确实需要 a tuple,则可以使用生成器即时重新创建它:

例如:

to_remove = [name][n] # Assuming this is a unique str.

db_backup[name] = tuple(x for x in db_backup[name] if not to_remove)

注意:它有时工作的事实更多的是错误而不是功能。如果它有效,它不应该。


推荐阅读