Lua局部变量赋值

时间:2017-04-20 12:55:43

标签: lua variable-assignment local

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

2 个答案:

答案 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 (这可能是以后运行中新副本的基础)。