lua table引用问题
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,一,基础1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。tb = {}tb.a = 11tb.b = 22
千家信息网最后更新 2026年10月31日lua table引用问题
一,基础
1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。
tb = {}tb.a = 11tb.b = 22tb_ref = tbfunction p(tip) print("--------------------------" .. tip) print("tb.a = " .. tb.a .. " " .. "tb.b = " .. tb.b) print("tb_ref.a = " .. tb_ref.a .. " " .. "tb_ref.b" .. tb_ref.b)endp("原始")tb_ref.a = 33p("修改了引用的a = 33,原来的a也变了")tb.b = 44p("修改了原始的b = 44,引用的b也变了")print("----------------------非表test")a = 1c = ac = 3print("a = " .. a)print("c = " .. c) 打印结果:--------------------------原始tb.a = 11 tb.b = 22tb_ref.a = 11 tb_ref.b22--------------------------修改了引用的a = 33,原来的a也变了tb.a = 33 tb.b = 22tb_ref.a = 33 tb_ref.b22--------------------------修改了原始的b = 44,引用的b也变了tb.a = 33 tb.b = 44tb_ref.a = 33 tb_ref.b44----------------------非表testa = 1c = 3结果:
当改变表的一个值以后,它的引用的值也发生了变化;
对于非表的一般常数来说,它的赋值不存在引用的问题;
2,table存储
1)table里保存数据,数据可以是任何类型,包括function。
2)table里也可以保存table
3)key代表数据存储的位置
4)value就是用特定的key存储的数据
二,记录遇见的一个关于table的问题
代码如下:
local cjson = require("cjson")local t = {["GET"] = {["/a"] = "f"}}function hehe(node) node["TOKEN"] = node["TOKEN"] or {} ngx.log(ngx.ERR, "0", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "0", cjson.encode(node)) ngx.log(ngx.ERR, "0", tostring(node)) node = node["TOKEN"] ngx.log(ngx.ERR, "1", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "1", cjson.encode(node)) ngx.log(ngx.ERR, "1", tostring(node)) node["TOKEN"] = "123" ngx.log(ngx.ERR, "2", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "2", cjson.encode(node)) ngx.log(ngx.ERR, "2", tostring(node))endhehe(t["GET"])ngx.say("ok")nginx日志中的结果:
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):8: hehe(): 0{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):9: hehe(): 0{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):10: hehe(): 0table: 0x41dfca60, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):13: hehe(): 1{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):14: hehe(): 1{}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):15: hehe(): 1table: 0x41e011e0, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):18: hehe(): 2{"\/a":"f","TOKEN":{"TOKEN":"123"}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):19: hehe(): 2{"TOKEN":"123"}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):20: hehe(): 2table: 0x41e011e0, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"结果分析:
1,lua中table相关操作包括做为function的参数都是引用操作,在function中对table node的key,value的相关操作都是对原table t的操作;
2,node = node["TOKEN"] 这一步操作相当于把node的内存地址指向了node["TOKEN"]的内存地址(即t["GET"]["TOKEN"]的内存地址),故之后对node的操作,都会影响到t["GET"]["TOKEN"]。
原始
内存
数据
结果
地址
存储
问题
两个
指向
代码
代表
位置
参数
变量
只是
基础
就是
常数
日志
空间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州大一互联网络科技有限公司
新华互联网科技学院
上海挚品互联网科技
互联网科技美容
互联网 科技服务平台
富国互联网科技创新基金
互联网系的金融科技公司
互联网为啥属于高科技
青岛科技大学互联网大赛研究生
呼和浩特新华互联网科技学院
互联网公司黑科技创始人
长沙茂晟互联网科技有限公司
四川慕妮娅互联网科技有限公司
城市宝互联网科技有限公司
山东大美朱楼互联网科技有限公司
易企秀互联网科技是做什么的
10位科技互联网大佬
恒生互联网科技趋势
伍佰万互联网科技是干嘛的
如何强化互联网金融科技
互联网科技会
互联网核心科技是什么
互联网科技媒体
互联网科技上市公司
特约风豹互联网科技为什么扣费
互联网数据科技专业
35岁以上互联网科技行业
玉溪新华互联网科技怎么选
互联网对科技影响
黑龙江互联网科技公司