Python 在字典列表中插入元素

Python 在字典列表中插入元素,python,django,Python,Django,我声明了一个空列表,我想使用extend方法通过for循环追加字典,但最后得到一个列表,该列表在同一个字典的所有位置都具有相同的内容 代码如下: def get_tasks(self, actor, task_state): tasks = Task.objects.filter(actor=actor.id, state=task_state) tasks_to_return = [] task_data = {} for task in tasks:

我声明了一个空列表,我想使用extend方法通过for循环追加字典,但最后得到一个列表,该列表在同一个字典的所有位置都具有相同的内容

代码如下:

def get_tasks(self, actor, task_state):
    tasks = Task.objects.filter(actor=actor.id, state=task_state)
    tasks_to_return = []
    task_data = {}

    for task in tasks:
        task_data['name'] = getattr(task, 'name')
        task_data['description'] = getattr(task, 'description')
        task_data['start_date'] = getattr(task, 'start_date')
        task_data['finish_date'] = getattr(task, 'finish_date')
        task_data['situation'] = task.get_situation()
        tasks_to_return.extend(task_data)

    return tasks_to_return

如果我将extend更改为append,结果甚至是最糟糕的。

这是因为您每次都将同一个字典添加到列表中:实际上,您只更改该字典的键/值,然后再次添加该字典,以此类推

此外,通过使用extend,实际上可以将元素的iterable添加到列表中。字典是一个iterable:你在键上迭代

因此,您应该做的是1每次构造一个新词典,2使用append而不是extend:

for task in tasks:
    task_data = {}
    task_data['name'] = getattr(task, 'name')
    task_data['description'] = getattr(task, 'description')
    task_data['start_date'] = getattr(task, 'start_date')
    task_data['finish_date'] = getattr(task, 'finish_date')
    task_data['situation'] = task.get_situation()
    tasks_to_return.append(task_data)
现在,由于列表最初为空,我们还可以使用列表理解:


这是因为您每次都将同一个字典添加到列表中:实际上,您只需更改该字典的键/值,然后再次添加该字典,以此类推

此外,通过使用extend,实际上可以将元素的iterable添加到列表中。字典是一个iterable:你在键上迭代

因此,您应该做的是1每次构造一个新词典,2使用append而不是extend:

for task in tasks:
    task_data = {}
    task_data['name'] = getattr(task, 'name')
    task_data['description'] = getattr(task, 'description')
    task_data['start_date'] = getattr(task, 'start_date')
    task_data['finish_date'] = getattr(task, 'finish_date')
    task_data['situation'] = task.get_situation()
    tasks_to_return.append(task_data)
现在,由于列表最初为空,我们还可以使用列表理解:

扩展或追加会将原始引用添加到任务_数据,您会不断更改其内容。相反,可以为task_数据创建一个新的空对象,或者附加一个重复使用的对象的副本:

import copy
...
    tasks_to_return.append(copy.copy(task_data))
扩展或追加会将原始引用添加到任务_数据,您会不断更改其内容。相反,可以为task_数据创建一个新的空对象,或者附加一个重复使用的对象的副本:

import copy
...
    tasks_to_return.append(copy.copy(task_data))

您不应该在每个循环迭代中创建一个新的dict来附加到任务返回中吗?另外,我认为您应该使用append而不是extend。您不应该在每个循环迭代中创建一个新的dict来追加到任务返回中吗?另外,我认为您希望使用append而不是extend。太棒了!一切都很顺利。今天是一个非常有成效的学习日。谢谢!好极了一切都很顺利。今天是一个非常有成效的学习日。谢谢!
import copy
...
    tasks_to_return.append(copy.copy(task_data))