我在朱莉娅遇到元组问题。这是我想要做的事情
julia> temp = [1 2 3]
julia> A = tuple(temp, temp)
julia> B = tuple(A,A,A)
B看起来像这样:
julia> B
((
[1 2 3],
[1 2 3]),(
[1 2 3],
[1 2 3]),(
[1 2 3],
[1 2 3]))
我知道我可以访问B中的'非常'第一个元素 B [1] [1] [1]返回1(如预期的那样)
但是,如果我尝试将特定值分配给B [1] [1] [1],请说如果我这样做,
julia> B[1][1][1] = 20
,这就是我得到的,
julia> B
((
[20 2 3],
[20 2 3]),(
[20 2 3],
[20 2 3]),(
[20 2 3],
[20 2 3]))
所有子元组的第一个元素已被更改。有没有办法改变B [1] [1] [1]的值而不影响其他子元组?
提前致谢。
PS:我在Ubuntu 16.04(64位)上使用Julia 0.5.0
答案 0 :(得分:4)
这对元组来说不是一个问题。如果您使用数组,则会发生完全相同的事情。
A = (temp, temp)
将在内存中引用相同的地址两次。所以你需要做A = (copy(temp), copy(temp))
但是......
复制(x)
创建x的浅表副本:复制外部结构,但是 并非所有内部价值。例如,复制数组会产生新的 与原始元素具有相同元素的数组。
因此,对于B = (A, A, A)
,我们需要使用deepcopy
来获取每个变量的值(而不是引用)。即B = (deepcopy(A), deep copy(A), deepcopy(A))
在此处查看copy
和deepcopy
的文档:
http://docs.julialang.org/en/release-0.4/stdlib/base/#Base.copy
答案 1 :(得分:2)
A = (temp,temp)
你把它变成了所有相同数组的元组(注意你可以写A = (copy(temp),copy(temp))
)。如果要使用数组的副本,请使用A = (temp,temp)
。数组的值是它的引用,因此当你执行git.exe push --progress "origin" master:master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 7.54 MiB | 240 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
error: failed to push some refs to 'https://...'
时,你只有两个对同一块内存的引用,这就是为什么当你改变一个时,另一个改变。
答案 2 :(得分:-2)