最近,我一直在研究一些Lua代码,作者多次分配一个局部变量,修改局部变量似乎也会改变赋值变量的预期结果,因为之后他不会对局部变量做任何事情。是这种情况还是做这些更改不影响原始值。
基因构建
local gene = {}
gene.into = 0
gene.out = 0
gene.weight = 0.0
gene.enabled = true
gene.innovation = 0`代码
function nodeMutate(genome)
if #genome.genes == 0 then
return
end
genome.maxneuron = genome.maxneuron + 1
local gene = genome.genes[math.random(1,#genome.genes)]
if not gene.enabled then
return
end
gene.enabled = false
local gene1 = copyGene(gene)
gene1.out = genome.maxneuron
gene1.weight = 1.0
gene1.innovation = newInnovation()
gene1.enabled = true
table.insert(genome.genes, gene1)
local gene2 = copyGene(gene)
gene2.into = genome.maxneuron
gene2.innovation = newInnovation()
gene2.enabled = true
table.insert(genome.genes, gene2)
end发布于 2017-04-20 14:44:44
对gene的更改可能会影响genome.genes[math.random(1,#genome.genes)],因为gene是引用。来自Lua手册-值和类型
表、函数、线程和(完整)用户数据值是对象:变量实际上不包含这些值,只有对它们的引用。赋值、参数传递和函数返回总是操纵对这些值的引用;这些操作并不意味着任何类型的复制。
这意味着,当将变量赋值给对象时,将引用复制到该对象,而不是对象本身。
例如:
local a = {1,2,3}
local b = a
b[1] = 'a'表a现在包含{'a',2,3},因为b是对a的引用。
发布于 2017-04-20 20:59:54
根据我对代码的阅读,我会认为:
local gene1 = copyGene(gene) -- local copy, distinct from original 'gene'
-- (modifications of 'gene1')
table.insert(genome.genes, gene1) -- add modified copy to 'genome.genes'因此,我猜想copyGene会生成gene的副本,这意味着gene没有被修改(只有gene1、gene2)。对这些变量的引用保存在local变量中,这些引用确实超出了块末尾的范围。但是修改后的副本被添加到列表中(/ genome.genes / sequence,不管您想称它是什么),它确实会产生外部可见的效果(因为这个变量-- genome --来自外部)。
我对代码的更高层次印象是,genome.genes是一个基因列表,它可能是enabled,也可能不是enabled。每次运行这个函数都会随机选择这些gene中的一个,如果它是enabled,(1)禁用它,(2)向genome.genes中添加两个修改的enabled副本(这可能是以后运行中新副本的基础)。
https://stackoverflow.com/questions/43520189
复制相似问题