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
没有被修改(只有 gene1
、gene2
).对这些的引用保存在 local
变量中,这些引用确实在块的末尾超出了范围。 但是修改后的副本被添加到列表中(/数组/序列,随便你怎么称呼它)genome.genes
确实产生外部可见的效果(因为那个变量 – genome
– 来自外部)。
我对代码的更高层次的印象是genome.genes
是一个可能是也可能不是enabled
的基因列表。通过此函数的每个 运行 随机选择这些 gene
之一,如果它是 enabled
,(1) 禁用它并且 (2) 添加两个修改后的 enabled
副本到genome.genes
(这可能是以后 运行 中新副本的基础)。
我最近一直在看一些 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
没有被修改(只有 gene1
、gene2
).对这些的引用保存在 local
变量中,这些引用确实在块的末尾超出了范围。 但是修改后的副本被添加到列表中(/数组/序列,随便你怎么称呼它)genome.genes
确实产生外部可见的效果(因为那个变量 – genome
– 来自外部)。
我对代码的更高层次的印象是genome.genes
是一个可能是也可能不是enabled
的基因列表。通过此函数的每个 运行 随机选择这些 gene
之一,如果它是 enabled
,(1) 禁用它并且 (2) 添加两个修改后的 enabled
副本到genome.genes
(这可能是以后 运行 中新副本的基础)。