julia输出文件中遇到的问题

各位小伙伴们大家好,我遇到了一点问题,思考了很久不知道为什么出现这种错误,以及如何改正,请大家帮我看看。

下面的代码1是可以成功运行的,但是一旦我将循环里面的shuffle去掉,产生的第二个文件2.csv就会出问题,请问是怎么回事?

shuffle函数和写入文件操作之间有什么必然联系吗?
写入文件操作中数据是怎么被写入的呢?

代码1

a0 = shuffle(a0);  # a0是1维数组,里面有1000个元素

profn = 2  # 文件数
filelist = Vector{String}(profn)  # 创建2个空字符串

for i=1:2
    S = net;
    a = shuffle(a0);

    filelist[i] = string(i, ".csv" )  # 批量产生文件名
    open( filelist[i], "w" ) do f
    ...
    end
end

代码2

a0 = shuffle(a0);  # a0是1维数组,里面有1000个元素

profn = 2  # 文件数
filelist = Vector{String}(profn)  # 创建2个空字符串

for i=1:2
    S = net;
    a = a0;

    filelist[i] = string(i, ".csv" )  # 批量产生文件名
    open( filelist[i], "w" ) do f
    ...
    end
end

文件到底是怎么写入的,我也很想知道。
建议给一段能运行的代码,a0 的取值有没有影响;每个 csv 里写入了 a 的哪一部分;S 有没有用等等。变量过多可不好 debug。总之精简一下,给一段能复现问题&&能运行的代码。

你可以试试 a0 取少量元素,比如 2 个;然后用 CSV.jl 包写入看有没有问题(看了下 CSV 包用于写入 dataframe 简单的用 write 就行);与问题复现无关的变量可以删掉。


猜测 可能的原因是

help?> shuffle
search: shuffle shuffle!

shuffle([rng=GLOBAL_RNG,] v)

Return a randomly permuted copy of v. The optional rng argument specifies a random number
generator (see Random Numbers). To permute v in-place, see shuffle!. To obtain randomly
permuted indices, see randperm.

用这个函数会返回 a0 的一个乱序的副本,这就不会影响原有的数组。直接用赋值语句其实都是指向同一个对象,之后对 a 的改动也会影响 a0 ,大概是深拷贝/浅拷贝的区别。

或者像 py 那边一样你写入/读取完一个文件后,文件指针指向文件末尾,不重置就有问题。