循环迭代0的变量传递给下一个循环等

时间:2014-03-20 17:03:18

标签: python loops if-statement for-loop

首先,为我糟糕的Python技能道歉 - 已经成为一名平庸的IDL用户,因此我知道我没有以最好的方式做事。

这是问题所在,我正在对一个文件循环进行分析。我正在生成一个名为so2c的图像。对于这个图像,我想找到图像和之前的图像之间的差异,因此只想在第一个图像之后的循环中执行此操作。但是,以下代码会引发错误“NameError:全局名称'so2dat'未定义”。我以前通过将所有图像存储到一个巨大的numpy数组然后找到差异来使代码工作。然而,超过约150张图像我的内存不足。帮助赞赏:)

for files in files_list:

    fname1 = files
    .....do some more processing to generate an image array ([512,644]) called so2c

    if files_list.index(files)==0: 
        so2dat=so2c
        timea=times2
    else:
        sdiff= so2c-so2dat
        tdiff= times2-timea
        so2dat=so2c
        timea=times2

4 个答案:

答案 0 :(得分:2)

问题很简单。您正在so2dat块中定义if,并且您正在else块中使用它。每次迭代只能输入一个块而不能输入另一个块。因此,如果您在输入else数据块之前输入if数据块,则不会在so2dat数据块中执行if的定义。

查看一个非常简单的例子:

>>> for word in "foo bar baz".split():
        if word[0] == 'f':
            hello = "hello"
        else:
            print hello

hello
hello
>>> for word in "foo bar baz".split():
        if word[0] == 'b':
            blah = "blah"
        else:
            print blah

Traceback (most recent call last):
  File "<pyshell#25>", line 5, in <module>
    print blah
NameError: name 'blah' is not defined

首先输入if块无需担心,但如果先输入else块,则会得到NameError

考虑一下,如果你试图确保只在第一次迭代时输入if块,你可以使用enumerate并使用其中的计数部分来检查你是否在第一次迭代。或者,您可以执行类似这样的操作(只需从循环中删除第一个迭代,单独执行,然后循环覆盖files_list的其余部分):

so2dat, timea = do_some_processing_on(files_list[0])
for files in files_list[1:]:
    fname1 = files
    so2c, times2 = do_some_processing_on(fname1)
    # what have you
    sdiff= so2c-so2dat
    tdiff= times2-timea
    so2dat=so2c
    timea=times2

答案 1 :(得分:0)

似乎您在定义之前尝试使用变量。

    so2dat=so2c
    timea=times2
else:
    # where does it get defined for use here?
    sdiff= so2c-so2dat

答案 2 :(得分:0)

在输入if块之前初始化so2dat:

....
so2dat=so2c
if files_list.index(files)==0: 
    so2dat=so2c
...

答案 3 :(得分:0)

最简单的方法是在循环外声明变量,然后查看它是否已经设置。简化示例:

lastImage = None
for image in images:
    # do stuff
    if lastImage is not None:
        # compare images
    lastImage = image