我最近一直在查看一些Lua代码,并多次给作者分配一个局部变量,改变局部变量,似乎也改变了分配变量的预期结果,因为他之后没有对局部变量做任何事情。是这种情况还是这些更改不会影响原始值。
基因构建
docker logs drupaldocker_myapp_1
代码
abc.sh boot etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
#!bin/sh
ls
cat /abc.shabc.sh boot etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
#!bin/sh
ls
cat /abc.sh
答案 0 :(得分:3)
对gene
的更改可能会影响genome.genes[math.random(1,#genome.genes)]
,因为gene
是参考。来自Lua Manual - Values and Types:
表,函数,线程和(完整)userdata值是对象:变量实际上不包含这些值,只是对它们的引用。赋值,参数传递和函数返回总是操纵对这些值的引用;这些操作并不意味着任何形式的复制。
这意味着当您将变量分配给对象时,您将复制对该对象的引用,而不是对象本身。
例如:
local a = {1,2,3}
local b = a
b[1] = 'a'
表a
现在包含{'a',2,3}
,因为b
是对a
的引用。
答案 1 :(得分:0)
从我对代码的阅读中我会想到以下内容:
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
,{{1 }})。对这些引用的引用保存在gene2
变量中,这些引用确实超出了块的末尾。 但是修改后的副本被添加到列表中(/ array / sequence,无论你想要什么叫它)local
产生外部可见的效果(因为变量 - genome.genes
- 来自外部。)
我对代码的更高级别印象是genome
是一个基因列表,可能是也可能不是genome.genes
。每次运行此函数都会随机选择其中一个enabled
,如果是gene
,则(1)禁用它,(2)将两个修改后的enabled
副本添加到enabled
(这可能是以后运行中新副本的基础)。