zoukankan      html  css  js  c++  java
  • !!! 注意区分 lua table 变量的【原地修改】与【重新赋值】

    例一:

    local a,b
    
    a = {5}
    
    b = a
    
    a = nil
    
    print(b[1])    ----结果为: 5

    关键在于:等号是赋值语句!

    a = nil 这句指令是使 变量 a 的指针重新指向 nil; 而不是清空了原来 table 的那块内存。 所以变量 b 的指针仍然指向原来的 table;

    也就是说,原来的那个table 的引用计数 从2 减为 1 。

    例二:

    local a,b
    
    a = {5}
    
    b = a
    
    a = {10}
    
    print(b[1])    ----结果为: 5

    道理是一样的, a = {10} 这句指令,是 new 了一个新的 table,把它的地址重新赋给了 a;所以 b 仍然指向原来的 table 没有收到影响;

    '' { } '' 是声明一个新的table ,相当于 new。

    例三:

    换个样子也要认得:

    local a,b
    
    a = { data = {value = 5}}
    
    b = a.data
    
    a.data = nil
    
    print( b.value )    ----结果为: 5
    
    
    ---------------------------------------------------------------
    
    
    local a,b
    
    a = { data = {value = 5}}
    
    b = a.data
    
    a.data = { value = 1000 }
    
    print( b.value )    ----结果为: 5

    例四:

    如果我真的想让 b 受到影响,随着源数据的清空而清空怎么办???

    那就要避免指针的变向,一定要在原地修改table !

    local a,b
    
    a = { data = {value = 5}}
    
    b = a


    a.data.value = 1000

    print(b.data.value) ----结果为 1000
    a.data
    = nil print( b.data) ----结果为: nil


    b 和 a 是指向同一块内存的, a.data 就是 b.data;

    这样一来,我等同于是对 b 进行了操作。

    00

  • 相关阅读:
    5 Python3 函数进阶&迭代器与生成器
    2 python第三章文件操作
    4 python内置函数
    python内置函数 eval()、exec()以及complie()函数
    0 字符与字节的区别
    python enumerate() 函数
    1 python 文件处理
    python 之编写登陆接口
    python 之九九乘法表
    第一模块第二章-数据类型整理
  • 原文地址:https://www.cnblogs.com/rollingyouandme/p/14732047.html
Copyright © 2011-2022 走看看