为什么 Julia 中的 reshape() 不会更改函数中数组的内容?

Jay*_*ong 1 arrays syntax matrix julia

我想重塑函数内部的矩阵,因此我在函数外部“声明”了一个数组并reshape()在函数中使用。尽管数组是可变的,但它并没有真正起作用。

julia> my_array = 1:10
1:10

julia> function test(array)
           array = reshape(array, 2, 5)
           println(array)
       end
test (generic function with 1 method)

julia> test(my_array)
[1 3 5 7 9; 2 4 6 8 10]

julia> println(my_array)
1:10
Run Code Online (Sandbox Code Playgroud)

函数内部,my_array已经被重塑为2*5的矩阵,但执行函数后又恢复为1:10。

我想知道这背后的原因,以及如何重塑函数内部的全局数组?

编辑:我的问题与lisp 中的变量引用不同,我知道将变量副本传递到堆栈的想法。对于这个问题,我不知道为什么特定函数reshape()不会更改数组的内容,即使我传递了可变对象的引用。

eva*_*man 5

来自文档

假设您调用这样的函数:

julia> x = 10
10

julia> function change_value!(y)
           y = 17
       end
change_value! (generic function with 1 method)

julia> change_value!(x)
17

julia> x # x is unchanged!
10
Run Code Online (Sandbox Code Playgroud)

在 Julia 中,变量的绑定x不能通过x 作为参数传递给函数来更改。change_value!(x)在上面的例子中调用时,y是一个新创建的变量,最初绑定到 的值x,即 10;然后y反弹到常量 17,而x外部作用域的变量保持不变。

因此,您不能通过在函数内重新分配传递的值来重新分配变量。

话虽这么说,一些集合允许突变(但仍然不能重新分配):

julia> function mut(x)
       x[1] = 100
       end
mut (generic function with 1 method)

julia> a = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> mut(a)
100

julia> a
3-element Array{Int64,1}:
 100
   2
   3
Run Code Online (Sandbox Code Playgroud)

如果您想更改数组本身并获得其他答案,您可以使用元组返回多个值:

julia> function dubSum(x)
           x = hcat(x,x)
           sum_val = sum(x)
           return (x, sum_val)
       end
dubSum (generic function with 1 method)

julia> x = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> x, sum_val = dubSum(x)
(
3x2 Array{Int64,2}:
 1  1
 2  2
 3  3,

12)

julia> x
3x2 Array{Int64,2}:
 1  1
 2  2
 3  3

julia> sum_val
12
Run Code Online (Sandbox Code Playgroud)