Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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 - Fatal编程技术网

循环内部的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

我对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 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:)