enumerate()的奇怪行为

时间:2014-10-17 00:17:08

标签: python python-2.7 enumerate

所以我正在阅读这个PPM文件,逐行阅读,在这里和那里操作它,并将新行写入另一个文件。我尝试生成一个最小的工作示例来重现行为,但是当我写一个最小的例子时,奇怪的行为消失了 - 但我无法弄清楚这是导致这种奇怪行为的部分原因。所以完整的代码如下。

def flip_horizontal(infile, outfile):
with open(os.getcwd() + '\\' + infile, 'r') as f:
    outfile = open(os.getcwd() + '\\' + outfile, 'w')
    rgbCounter = 0
    for i, line in enumerate(f):
        if i < 3:
            outfile.write(line)
        if i == 1:
            width = int(line.split()[1])
            lineList = [None for i in range(width*3)]
            if width > 1024:
                print "Image size too large:  Buffer can only store 1024 \
                    pixels at a time.  Aborting negate_red."
                break
        if i > 2:
            print line
            for integer in line.split():
                if rgbCounter%3 == 0:
                    lineList[width*3-rgbCounter-3] = integer
                elif rgbCounter%3 == 1:
                    lineList[width*3-rgbCounter-1] = integer
                else:
                    lineList[width*3-rgbCounter+1] = integer
                rgbCounter += 1
                if rgbCounter == width*3:
                    outfile.write(' '.join(lineList))
                    outfile.write('\n')
                    rgbCounter = 0
    outfile.close()

这就是问题所在:当我运行此代码时,if i > 2:之后的“打印”行也会打印第2行(或者更确切地说,第3行,索引为2的行)!在一个更简单的例子中,如果我只是说

...
if i > 2:
    print line
...

它只会打印第4行和之后的行,但是我实际运行的其余代码的一些内容使得它打印第3行。任何想法为什么以及如何解决这个问题?

以下是一个示例输入:

P3
4 4
255
49   49   49    100   100   100     0   200   0     0   0   0 
100  100  100   100   0     0       200 200   200   255 255 255
200  100  0     0     100   200     0   0     0     50  50  50
0    0    0     0     0     0       0   0     0     0   0   0

当我运行代码时,我得到了打印的行

4 4

49   49   49    100   100   100     0   200   0     0   0   0 

100  100  100   100   0     0       200 200   200   255 255 255

...

包含“4 4”的第一行不应该存在。

1 个答案:

答案 0 :(得分:3)

问题是您要更改语句
i[None for i in range(width*3)]的值。 i遇到width*3 - 1后会if i > 2,然后评估为True
只需更改变量名称([None for j in range(width*3)])即可。请注意,i > 2表示要打印的第一行是第四行(索引3)。如果您想要打印第三个,则应使用if i > 1
显示行为的最小示例:

def test():
    a = ['a', 'b', 'c', 'd']
    for i, char in enumerate(a):
        if i==1:
            var = [None for i in range(4)]
        if i>2:
            print(i, char)
             test()