Lua局部变量赋值

Lua local variable assignment

我最近一直在看一些 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

gene 的更改可能会影响 genome.genes[math.random(1,#genome.genes)],因为 gene 是参考。来自 Lua Manual - Values and Types:

Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.

这意味着当您将变量分配给对象时,您复制的是对该对象的引用,而不是对象本身。

例如:

local a = {1,2,3}
local b = a
b[1] = 'a'

table a 现在包含 {'a',2,3} 因为 b 是对 a.

的引用

根据我对代码的阅读,我认为如下:

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 没有被修改(只有 gene1gene2 ).对这些的引用保存在 local 变量中,这些引用确实在块的末尾超出了范围。 但是修改后的副本被添加到列表中(/数组/序列,随便你怎么称呼它)genome.genes 确实产生外部可见的效果(因为那个变量 – genome – 来自外部)。

我对代码的更高层次的印象是genome.genes是一个可能是也可能不是enabled的基因列表。通过此函数的每个 运行 随机选择这些 gene 之一,如果它是 enabled,(1) 禁用它并且 (2) 添加两个修改后的 enabled 副本到genome.genes(这可能是以后 运行 中新副本的基础)。