关于我下面的代码(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
答案 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)]