Python 在字典列表中按键赋值时出现问题

Python 在字典列表中按键赋值时出现问题,python,string,list,python-2.7,dictionary,Python,String,List,Python 2.7,Dictionary,我有一个这样的字典列表: dictionary_list = [{"id":""},{"id":""}] dictionary_list = [{"id":""}]*2 编辑:由于目的是允许列表中的元素数量可变,因此列表实际上是以这种方式构建的: shelves = 2 book = {"id":""} dictionary_list = [] for counter in range(shelves): dictionary_list.append(book) 编辑:我还尝试了社

我有一个这样的字典列表:

dictionary_list = [{"id":""},{"id":""}]
dictionary_list = [{"id":""}]*2
编辑:由于目的是允许列表中的元素数量可变,因此列表实际上是以这种方式构建的:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)
编辑:我还尝试了社区建议的以下方法:

shelves = 2
book = {"id":""}
dictionary_list = [book for i in range(shelves)]
我试图将第一个元素的id分配给apple,如下所示:

dictionary_list[0]["id"] = "apple"
shelves = 2
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append({"id":""})
结果是:

print dictionary_list
>> [{"id":"apple"},{"id":"apple"}]
当然,当我将orange分配给dictionary_list[1][id]时,两个id都将更改为orange


这是怎么回事?谢谢

之所以会发生这种情况,是因为您启动了以下词典:

dictionary_list = [{"id":""},{"id":""}]
dictionary_list = [{"id":""}]*2
或类似的。这实际上是对同一个字典的两个引用,因此当您更改一个字典的id键的值时,两个都会更改。这可以通过以下方式进行检查:

您可以通过如下方式启动字典来解决此问题:

dictionary_list = [{"id":""} for i in range(2)]
编辑:

鉴于新准则:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)
我们可以看到,每次for循环运行时,都会将同一本书的引用附加到dictionary_列表中。我们可以将其更改为如下工作方式:

dictionary_list[0]["id"] = "apple"
shelves = 2
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append({"id":""})
或:


之所以会发生这种情况,是因为您启动了以下词典:

dictionary_list = [{"id":""},{"id":""}]
dictionary_list = [{"id":""}]*2
或类似的。这实际上是对同一个字典的两个引用,因此当您更改一个字典的id键的值时,两个都会更改。这可以通过以下方式进行检查:

您可以通过如下方式启动字典来解决此问题:

dictionary_list = [{"id":""} for i in range(2)]
编辑:

鉴于新准则:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)
我们可以看到,每次for循环运行时,都会将同一本书的引用附加到dictionary_列表中。我们可以将其更改为如下工作方式:

dictionary_list[0]["id"] = "apple"
shelves = 2
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append({"id":""})
或:


您多次附加同一图书对象。您需要每次在循环中创建dict对象,或者将book.copy附加到列表中

像这样

对于货架上的柜台: 字典\u list.appendbook.copy 还是像这样

dictionary_list = [{"id":""} for counter in range(shelves)]

您多次附加同一图书对象。您需要每次在循环中创建dict对象,或者将book.copy附加到列表中

像这样

对于货架上的柜台: 字典\u list.appendbook.copy 还是像这样

dictionary_list = [{"id":""} for counter in range(shelves)]

谢谢你的id提示,但是我现在试着用几种方法来定义我的字典,包括我在原始问题中添加的字典和你描述的字典。我用id验证了这两个方法都使用相同的id创建了两个字典。太不寻常了。@AleisterTanekJavasMraz如前所述,鉴于编辑中添加的代码,您正在将图书词典的副本添加到列表中。当你编辑一本书的字典时,所有的副本都会发生变化。谢谢你的id提示,但我现在尝试用几种方法定义我的字典,包括我添加到原始问题中的字典和你描述的字典。我用id验证了这两个方法都使用相同的id创建了两个字典。太不寻常了。@AleisterTanekJavasMraz如前所述,鉴于编辑中添加的代码,您正在将图书词典的副本添加到列表中。编辑一本书词典时,所有副本也会更改。