首先,为我糟糕的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
答案 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