2015-10-07 99 views
0

我在这段代码的行为,这是一个函数内部颇为吃惊:如何将对象列表更改为字典列表?

 for user in full_details["users"]: 
      user = collections.defaultdict(lambda: False, user) 
      if user["comments"]: 
       user["comments"] = [comment.__dict__ for comment in user["comments"]] 
       print("just converted user comments to dict objects") 
       print(user["comments"]) 


     print("printing full details") 
     print(full_details) 

我的理解是,如果我修改字典或列表,该修改应用于对象,并将继续。但是,当我在full_details["users"]中更改user["comments"]时,我的if内我没有再看到这些相同的更改,这些更改在full_details之后再次反映出来。这是为什么?我认为每当你创建一个新列表并将其分配给一个传入参数时,这个新列表就会在该函数之外存在。

我的问题是,在这里所做的更改不会保留:

   user["comments"] = [comment.__dict__ for comment in user["comments"]] 

此外,full_details是default_dict:

full_details = collections.defaultdict(lambda: False, thread_details.__dict__) 
+0

full_details是一个正常的列表或字典,还是像查询集或其他一些其他对象? – Monkpit

+0

@Monkey full_details是一个default_dict:full_details = collections.defaultdict(lambda:False,thread_details .__ dict__) – sunny

+0

您正在创建一个包含旧内容副本的旧用户字典,修改它,然后将其扔掉。另外,我强烈建议不要将这个对象转换为字典 - 这是侵入式的,不清楚字典中实际结束了什么,并且它会阻止您在不破坏这些字典的情况下改变注释类在内部的工作方式。我一直在这里,这不是一个有趣的地方。 – Eevee

回答

1

要分配 “用户” 两次。首先在for语句中。然后在for循环体的第一行中,创建一个新对象并将其分配给“user”。此时,您已经失去了对原始对象的引用。

相关问题