-3

关于我下面的代码(Python语言),为什么下面的打印语句(在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

新参考数组:

[10, 1]

新参考数组:

[10, 1]

本地数组

[10, 1]

测试点 4

ISSUE:似乎应该在“new_ref_array”行之前而不是在“new_ref_array”行之后打印“local 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
4

1 回答 1

3

执行此操作时,您不会关闭文件:

file.close

您只是将 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)]
于 2013-09-12T05:53:26.050 回答