如何在Julia中定义变异函数,您希望将结果写入其中一个输入.
我知道函数存在push!(list, a)
,它们会改变它们的输入但是如何使用感叹号定义我自己的一个.
Lyn*_*ite 16
这!
只是一个惯例; 它不是变异功能的必要条件.
任何函数都可以改变其输入.但是很明显,它正在这样做,我们用一个后缀!
.
但是,要变异的输入必须是可变的.其中包括String
s,Tuples,Int64
s,Float32
s等.以及使用immutable
关键字定义的自定义类型.
大多数类型都是可变的,比如Vectors.但您确实需要确保更改其内容,而不是对它们的引用.
比如说,我们想要创建一个函数,用数字2替换向量的所有元素.(这fill!(v,2)
是执行此操作的Base方法.但是例如,为了这个例子)
改变v
包含的内容:
function right1_fill_with_twos!(v::Vector{Int64})
v[:]=[2 for ii in 1:length(v)]
end
Run Code Online (Sandbox Code Playgroud)
这与以下相同:
function right2_fill_with_twos!(v::Vector{Int64})
for ii in 1:length(v)
v[ii]=2
end
v
end
Run Code Online (Sandbox Code Playgroud)
正在改变这个名字v
指向的东西
function wrong1_fill_with_twos!(v::Vector{Int64})
v=[2 for ii in 1:length(v)]
end
Run Code Online (Sandbox Code Playgroud)
这与以下相同:
function wrong2_fill_with_twos!(v::Vector{Int64})
u = Vector{Int64}(length(v))
for ii in 1:length(v)
u[ii]=2
end
v = u
end
Run Code Online (Sandbox Code Playgroud)
你不能修改不可变变量(比如Int64
s)的原因是因为它们没有要修改的内容 - 它们是它们自己的内容.
这个概念必须更改传入函数的变量的内容,而不是更改名称绑定的内容(替换对象),这在许多编程语言中是相当标准的.它来自pass by value,其中一些值是引用.我听说它在Java中称为黄金法则(参考文献)