首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua局部变量分配

Lua局部变量分配
EN

Stack Overflow用户
提问于 2017-04-20 12:55:42
回答 2查看 973关注 0票数 0

最近,我一直在研究一些Lua代码,作者多次分配一个局部变量,修改局部变量似乎也会改变赋值变量的预期结果,因为之后他不会对局部变量做任何事情。是这种情况还是做这些更改不影响原始值。

基因构建

代码语言:javascript
复制
local gene = {}
gene.into = 0
gene.out = 0
gene.weight = 0.0
gene.enabled = true
gene.innovation = 0`

代码

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-20 14:44:44

gene的更改可能会影响genome.genes[math.random(1,#genome.genes)],因为gene是引用。来自Lua手册-值和类型

表、函数、线程和(完整)用户数据值是对象:变量实际上不包含这些值,只有对它们的引用。赋值、参数传递和函数返回总是操纵对这些值的引用;这些操作并不意味着任何类型的复制。

这意味着,当将变量赋值给对象时,将引用复制到该对象,而不是对象本身。

例如:

代码语言:javascript
复制
local a = {1,2,3}
local b = a
b[1] = 'a'

a现在包含{'a',2,3},因为b是对a的引用。

票数 3
EN

Stack Overflow用户

发布于 2017-04-20 20:59:54

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

代码语言:javascript
复制
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 / sequence,不管您想称它是什么),它确实会产生外部可见的效果(因为这个变量-- genome --来自外部)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43520189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档