Python 创建具有相同键的词典列表?

Python 创建具有相同键的词典列表?,python,django,dictionary,for-loop,Python,Django,Dictionary,For Loop,我想创建一个包含x个字典的列表,所有字典都包含相同的键,但在for循环中具有不同的值: 差不多 [{'name': Brenda, 'Age': 22, 'Sex': Female}, {'name': Jorda, 'Age': 32, 'Sex': Male}, {'name': Richard, 'Age': 54, 'Sex': Male}] 我的代码是: people = [] person = {} humans = gethumans() for human in

我想创建一个包含x个字典的列表,所有字典都包含相同的键,但在for循环中具有不同的值:

差不多

[{'name': Brenda, 'Age': 22, 'Sex': Female},
 {'name': Jorda, 'Age': 32, 'Sex': Male},
 {'name': Richard, 'Age': 54, 'Sex': Male}]
我的代码是:

people = []
person = {}

humans = gethumans()

    for human in humans:
        number_people, people_data = People.data()
        person['name'] = human.name
        person['age'] = human.age
        person['Sex'] = human.name
        people.append(person)
我的输出是这样的:

[{'name': Richard, 'Age': 54, 'Sex': Male},
 {'name': Richard, 'Age': 54, 'Sex': Male}
 {'name': Richard, 'Age': 54, 'Sex': Male}]
因为字典值被替换而不是添加,它只是附加了相同的dicitnary。我怎样才能避开这件事

您每次都编辑同一本词典,因此您不必构建新词典,而是编辑旧词典。由于每次都将相同的词典附加到列表中,因此列表最终包含相同的词典n次,并且所有编辑都在该词典上处理

因此,您必须在
for
循环的每次迭代中构造一个新字典:

people = []
humans = gethumans()

for human in humans:
    number_people, people_data = People.data()
    person = {
        'name': human.name,
        'age': human.age,
        'sex': human.sex
    }
    people.append(person)
这将构造一个包含所有词典的列表。鉴于
for
循环没有副作用(看起来是这样),上述操作将起作用。

您每次都编辑同一个词典,因此您不会构建新词典,而是编辑旧词典。由于每次都将相同的词典附加到列表中,因此列表最终包含相同的词典n次,并且所有编辑都在该词典上处理

因此,您必须在
for
循环的每次迭代中构造一个新字典:

people = []
humans = gethumans()

for human in humans:
    number_people, people_data = People.data()
    person = {
        'name': human.name,
        'age': human.age,
        'sex': human.sex
    }
    people.append(person)

这将构造一个包含所有词典的列表。鉴于
for
循环没有副作用(看起来是这样),上述操作将起作用。

当您将字典person附加到列表people时,您只是将对字典的引用附加到列表中,因此列表最终只包含对同一字典的引用

由于每次循环都会用新值覆盖字典,因此列表的最后只包含对您最后添加的人的引用

您需要做的是为每个人创建一本新词典,例如:

for human in humans:
    number_people, people_data = People.data()
    person = dict()
    person['name'] = human.name
    person['age'] = human.age
    person['Sex'] = human.name
    people.append(person)

当您将字典person附加到列表people时,您只是将对字典的引用附加到列表中,因此列表最终只包含对同一字典的引用

由于每次循环都会用新值覆盖字典,因此列表的最后只包含对您最后添加的人的引用

您需要做的是为每个人创建一本新词典,例如:

for human in humans:
    number_people, people_data = People.data()
    person = dict()
    person['name'] = human.name
    person['age'] = human.age
    person['Sex'] = human.name
    people.append(person)

gethumans
在这里做什么?它是伪的,但它提供了我需要的数据列表,您在循环的每次迭代中都分配给同一个字典。在循环中移动
person={}
与整数不同,Python字典是可变对象。也就是说,您可以通过引用它们来更改它们的内容。
gethumans
在这里做什么?它是伪的,但它提供了我需要的数据列表,您在循环的每次迭代中都分配给同一个字典。在循环中移动
person={}
与整数不同,Python字典是可变对象。也就是说,你可以通过引用他们来更改他们的内容。旁白:我盯着这个答案看了整整2分钟,然后我决定,是的,“person”这个词在那个代码块中是粗体的,我必须看看你是如何做到的。@AdamSmith:我是从一个Prolog程序员那里学到这个技巧的(如果我没记错的话)。但我不知道最初是谁开始的:)。旁白:我盯着这个答案看了整整两分钟,然后我决定,是的,“person”这个词在那个代码块中是粗体的,我得看看你是怎么做到的。@AdamSmith:我是从一个Prolog程序员那里学来这个把戏的(如果我没记错的话)。但我不知道最初是谁开始的:)。从这一常见错误中可以学到的一个重要教训是,当你给字典键赋值时,你是在用新值覆盖旧值,但当你给变量赋值时,您只是将变量名重新分配给一个新的dictionary对象-旧dictionary对象仍然存在,对它的任何引用仍然有效。从这一常见错误中可以学到的一个重要教训是,当您将值分配给dictionary键时,您正在用新值覆盖旧值,但是,当您将字典分配给变量时,您只是将变量名称重新分配给一个新的字典对象——旧的字典对象仍然存在,对它的任何引用仍然有效。