Python打印输出执行乱序

时间:2013-09-12 05:49:32

标签: python

关于我下面的代码(Python语言),为什么下面的print语句(在get_a_maximal_subset函数中)

    file = open("_probe","a")
    file.write("\n new_ref_array: \n")
    file.write(str(new_ref_array))
    file.close

在(在下面的参考代码中)

之前打印到文件
                        file = open("_probe","a")
                        file.write("\n local_array \n")
                        file.write(str(local_array))
                        file.close

我在_probe文件中得到以下输出:

测试点2

测试点3

测试点3-b

测试点3-c

new_ref_array:

[10,1]

new_ref_array:

[10,1]

local_array

[10,1]

测试点4

问题:似乎应该在BEFORE之前而不是在“new_ref_array”行之后打印“本地数组”,因为“new_ref_array”行来自get_a_maximal_array函数,代码顺序是:

                        local_array = list(array[i:])
                        file = open("_probe","a")
                        file.write("\n local_array \n")
                        file.write(str(local_array))
                        file.close
                        i = i + 1
                        subset_candidate = get_a_maximal_subset(local_array, max, prefix)

====================我的代码如下:======================== ===================

                while (determination_process == True):
                    file = open("_probe","a")
                    file.write("\n test point 2 \n")
                    file.close
                    i = 0
                    for x in array:
                        file = open("_probe","a")
                        file.write("\n test point 3 \n")
                        file.close
                        prefix = []
                        local_process_ref = [max+1]
                        if (determination_process != True):
                            break
                        if (x not in global_process_ref):
                            file = open("_probe","a")
                            file.write("\n test point 3-b \n")
                            file.close
                            global_process_ref.append(x)
                            file = open("_probe","a")
                            file.write("\n test point 3-c \n")
                            file.close
                        local_array = list(array[i:])
                        file = open("_probe","a")
                        file.write("\n local_array \n")
                        file.write(str(local_array))
                        file.close
                        i = i + 1
                        subset_candidate = get_a_maximal_subset(local_array, max, prefix)
                        file = open("_probe","a")
                        file.write("\n test point 4 \n")
                        file.close

1 个答案:

答案 0 :(得分:3)

执行此操作时,您没有关闭文件:

file.close

您只是将close方法作为值引用。你想要的是调用关闭方法:

file.close()

最终,文件被垃圾收集,此时所有缓冲的数据都被刷新。但与此同时,您已在其他地方打开了相同的文件,并向其中添加了新数据。

在许多平台上,你的遗留缓冲区最终将覆盖后来添加的数据,而不是在它们之后添加,这使得调试更加困难。你在这里很幸运。 :)


如果您通过linter运行此代码,它会警告您。使用pylint,我得到“W0104:声明似乎没有效果”。但请注意,它不可能捕获所有此类错误。例如:

import random
r = random.random

在这里,您将r设置为random函数,而不是您想要的从0到1的随机数。

pylint无法知道;该声明具有效果,它可以很容易地成为可能想要的有用效果。实际上,我发现了两个完整的这个语句grepping source的例子(释义一点):

def build_list(n):
    r=random.random # only do the global lookup once instead of n times
    return [r() for _ in range(1000000)]

......或灵活性(虽然这不是一个很好的例子):

def build_list(n, r=None):
    if r is None:
        if have_urandom:
            r = lambda: urandom.read(1)
        except IOError:
            r = random.random
    return [r() for _ in range(1000000)]