在Julia

时间:2017-02-21 06:30:21

标签: tuples julia

我在朱莉娅遇到元组问题。这是我想要做的事情

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

3 个答案:

答案 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))

在此处查看copydeepcopy的文档: 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)

等号(a = b)

  • 简单类型被深层复制
  • 简单类型(或其他容器)的容器被复制阴影(它们的内部仅被引用,不被复制)

拷贝(x)的

  • 简单类型被深层复制
  • 简单类型的容器被深层复制
  • 容器容器:内容被复制阴影(内容的内容仅被引用,不被复制)

deepcopy的(x)的

  • 一切都是递归复制的