Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表在被要求添加字典之前先添加字典_Python_List_Dictionary - Fatal编程技术网

Python 列表在被要求添加字典之前先添加字典

Python 列表在被要求添加字典之前先添加字典,python,list,dictionary,Python,List,Dictionary,我正在尝试将字典附加到列表中,也就是说,我需要一个字典列表以进行进一步处理。 这些信息来自电子邮件,所以我正在使用“ezgmail”模块 发生的是上述列表中的意外行为,在我要求它更新之前,它似乎已经更新了。让我们从一个例子开始,这样我可以更好地理解自己 如果我这样做: listdict=[] dictname={'name':'John'} listdict.append(dictname) dictname={'name':'Sarah'} listdict.append(dictname)

我正在尝试将字典附加到列表中,也就是说,我需要一个字典列表以进行进一步处理。 这些信息来自电子邮件,所以我正在使用“ezgmail”模块

发生的是上述列表中的意外行为,在我要求它更新之前,它似乎已经更新了。让我们从一个例子开始,这样我可以更好地理解自己

如果我这样做:

listdict=[]
dictname={'name':'John'}
listdict.append(dictname)
dictname={'name':'Sarah'}
listdict.append(dictname)
打印(listdict)
[{'name':'John'},{'name':'Sarah'}]
这是完全正常的,也是预期的结果。但我的真实情况就是这样:

####在这里,我使用ezgmail.search搜索未读邮件,然后获取相同主题的未读邮件数量,并验证是否有未读邮件以及有多少未读邮件,然后:
###
orderDict={}
订单列表=[]
对于范围内的数字(amountMessages):
message=orderEmails[0]。messages[number]#将特定邮件作为邮件对象获取
stringMessage=str(message)#将消息对象转换为re.findall所需的字符串
stringName=re.search(((名称:)+(\w++\s\w+),stringMessage)#查找名称:xxx并分隔两部分
在列表中创建元组
name=stringName.group(2)
orderDict['Name']=名称
stringEmail=re.findall(([a-zA-Z0-9.\%+-]+@+[a-zA-Z0-9.-]+(\.[a-zA-Z]{2,4})),stringMessage)
查找电子邮件地址
tempEmailtuple=stringEmail[2]#我们需要的总是电子邮件#3
email=tempEmailtuple[0]#元组的第一部分包含整个电子邮件地址
ordedict['Email']=电子邮件
orderList.append(orderDict)
当我这样做时,我注意到只有最后一条消息的信息被附加。考虑到我是个新手,可能把事情搞砸了,我决定在Python控制台中手动执行所有操作,而不是使用for循环,只使用字典中的“name”键

message=orderEmails[0]。消息[0]
stringMessage=str(消息)
stringName=re.search(((名称:)+(\w++\s\w+),stringMessage)
name=stringName.group(2)
orderDict['Name']=名称
orderList.append(orderDict)
#到目前为止还不错,但是
message=orderEmails[0]。邮件[1]
stringMessage=str(消息)
stringName=re.search(((名称:)+(\w++\s\w+),stringMessage)
orderDict['Name']=名称

这就是魔法发生的地方。当使用
PyCharm
时,我可以清楚地看到,此时
orderList
被更新为
orderDict['name']
中的当前
值。如果我还没有调用
订单列表
,这怎么可能呢?

在您的代码中,您有:

ordedict={}
对于范围内的数字(amountMessages):
...
ordedict['Email']=电子邮件
您每次都在更新相同的
dict

您应该拥有的是:

用于范围内的数字(amountMessages):
orderDict={}
...
ordedict['Email']=电子邮件

在这里,您可以通过循环每次重新创建
orderDict

请在循环中声明字典:您每次都附加相同的字典,而不是创建新字典。谢谢大家。循环之外的orderDict是我尝试过的其他方法的残余,它只是滑倒了。但我的问题仍然是,为什么orderList会在orderDict发生变化的同时发生变化。这是我真的不明白的部分。是的,谢谢你的澄清。现在我仍然不明白的是,为什么每次orderDict发生变化时,orderList都会不断变化,即使它还没有到达orderList.append(orderDict)行。抱歉,如果这看起来很明显,但你能进一步澄清一下吗?谢谢你的强制性链接,该链接很有见地。