循环内部的Python异常处理
我对Python和编程都是新手。虽然我认为这个问题可能与我对异常处理的使用有关,但也可能是由于缺乏理解循环内部的Python异常处理,python,Python,我对Python和编程都是新手。虽然我认为这个问题可能与我对异常处理的使用有关,但也可能是由于缺乏理解 for i in range(0, len(dates)): try: data.append(WUF.getwx(location[j], dates[i])[1]) continue except xml.etree.ElementTree.ParseError: #copy last good row of data and
for i in range(0, len(dates)):
try:
data.append(WUF.getwx(location[j], dates[i])[1])
continue
except xml.etree.ElementTree.ParseError:
#copy last good row of data and use it for the missing day
fixdata = data[-1] #[1,2,3,4,5,6,7,8,9,10,11]
fixdata[10] = 'estimated'
data.append(fixdata)
当我以编写的方式运行代码时,我在数据中得到2行“估计”行。一个用于上一个日期,另一个用于正在估计的日期。如果我将fixdata
变量更改为[1,2,3,4,5,…]
,则只有一行(预计日期的预期行)是“预计的”
你知道我错过了什么吗?谢谢 问题在于:
fixdata = data[-1]
它实际上并不复制数据,它只复制对数据的引用fixdata
最终指向列表中的原始元素,因此
fixdata[10] = 'estimated'
它会更改原始数据
要实际复制数据,请尝试以下操作:
fixdata = data[-1][:]
[:]
复制整个列表,我认为您正试图这样做。听起来您好像在将列表附加到您的数据
列表--创建一个“列表列表”
那很好,我相信这是你打算做的。但在异常处理程序中,您实际上是在修改现有数据:
fixdata = data[-1]
此行将data
中最后一行的引用指定给fixdata
。此时,fixdata
和data[-1]
是同一个对象。因此,当您这样做时:
fixdata[10] = 'estimated'
然后,您正在“修复”的列表仍在数据
列表中,并且被名称修复数据
引用。两个名称,内存中的一个对象
当您再次附加它时,使用
data.append(fixdata)
你仍然没有复制它;现在,实际上在数据
列表中有两个对同一对象的引用。这就是为什么看起来有两条“估计”线——它们是同一个对象
您真正想要做的是复制最后一行,而不仅仅是引用它。将代码更改为:
for i in range(0, len(dates)):
try:
data.append(WUF.getwx(location[j], dates[i])[1])
continue
except xml.etree.ElementTree.ParseError:
#copy last good row of data and use it for the missing day
fixdata = data[-1][:] #[1,2,3,4,5,6,7,8,9,10,11]
fixdata[10] = 'estimated'
data.append(fixdata)
语法列表[:]是“此列表的每个元素”的简写,用作快速复制操作。然后fixdata将成为它自己的列表,您可以独立于原始代码更改的元素。关于原始代码示例的更多注释(超出您的问题范围)
除了将索引返回到日期列表中,您实际上从未使用过i变量。Python的优点之一是它的迭代器:您可以直接在列表中的项上迭代for循环,而无需对它们进行计数并使用索引变量:
for date in dates:
你的continue语句实际上没有任何作用continue
告诉解释器立即完成for循环的这个迭代,并立即开始下一个迭代。在这种情况下,在continue
语句之后没有任何语句,因此循环将自然继续,而不会被告知继续
实际上,不需要在两条语句中构建fixdata变量,在第三条语句中追加它,然后丢弃它(我们丢弃的是fixdata
变量,而不是它的内容),您可以这样做:
data.append(data[-1][:10] + ['estimated'])
except xml.etree.ElementTree.ParseError:
if data:
# do something
for date in dates:
try:
data.append(WUF.getwx(location[j], date)[1])
except xml.etree.ElementTree.ParseError:
# as long as we've parsed at least one good row
if data:
# copy last good row of data and use it for the missing day
data.append(data[-1][:10] + ['estimated'])
在一行中,这将最后一行的前10个元素复制到一个新列表中,将(非常短的)列表['estimated']添加到末尾,并将其追加
如果您的第一行抛出异常,您的代码将遇到问题——在这种情况下,您将无法访问数据[-1]
——尝试这样做将抛出另一个异常,该异常将向上传播。最好防止这样的情况:
data.append(data[-1][:10] + ['estimated'])
except xml.etree.ElementTree.ParseError:
if data:
# do something
for date in dates:
try:
data.append(WUF.getwx(location[j], date)[1])
except xml.etree.ElementTree.ParseError:
# as long as we've parsed at least one good row
if data:
# copy last good row of data and use it for the missing day
data.append(data[-1][:10] + ['estimated'])
总而言之,我将编写以下代码:
data.append(data[-1][:10] + ['estimated'])
except xml.etree.ElementTree.ParseError:
if data:
# do something
for date in dates:
try:
data.append(WUF.getwx(location[j], date)[1])
except xml.etree.ElementTree.ParseError:
# as long as we've parsed at least one good row
if data:
# copy last good row of data and use it for the missing day
data.append(data[-1][:10] + ['estimated'])
你的“继续”语句实际上没有任何作用;在try块的最后一行执行后,for循环将自然继续。您能接受其中一个答案吗?它们都写得很好。我不知道如果至少有一个数据.append
没有成功,如何调用(在第n.4点)数据[-1]
。如果第一个WUF.getwx()
调用抛出异常,那么当异常处理程序执行时,数据
可能仍然是空的。是的,你说得很对。我不知道为什么,但我当时想,除了
像其他。感谢您的澄清+1:)