Lua | 每日一练 (5)

news2025/3/4 8:59:17

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • Lua | 每日一练 (5)
    • 题目
    • 参考答案
      • 浅拷贝
      • 深拷贝
      • 使用场景

Lua | 每日一练 (5)

题目

lua 中深拷贝和浅拷贝的区别?如何实现深拷贝?

参考答案

深拷贝和浅拷贝是编程中常见的两种数据复制方式,它们的区别主要在于对数据结构中嵌套内容的处理方式。

下面针对这两种拷贝方式进行详细的梳理。

浅拷贝

浅拷贝是指创建一个新的对象,然后将原对象中的内容根据不同的类型选择不同的处理方式。

  • 如果内容是简单数据类型(如数字、字符串、布尔值),则直接复制值;
  • 如果内容是复杂数据类型(如对象、数组、表等),则只复制其引用(即内存地址),而不是复制其内部结构。

在这里插入图片描述

下面给出代码示例,如下所示:

local original = { a = 1, b = { c = 2 } }
local shallowCopy = {}

for k, v in pairs(original) do
    shallowCopy[k] = v
end

-- 修改嵌套表
shallowCopy.b.c = 3
print(original.b.c) -- 3

深拷贝

深拷贝是指创建一个新的对象,并递归地复制原对象中的所有内容,包括嵌套的复杂数据类型。深拷贝会创建完全独立的副本,修改副本中的内容不会影响原对象。

在这里插入图片描述

lua 标准库中没有直接提供深拷贝功能,但可以通过自己编写递归函数实现。例如:

local function deepCopy(original)
    -- 检查是否为表
    if type(original) ~= "table" then
        return original
    end

    -- 创建新表
    local copy = {}
    -- 遍历原表的所有键值对
    for k, v in pairs(original) do
        -- 递归拷贝值
        copy[deepCopy(k)] = deepCopy(v)
    end
    return copy
end

local original = { a = 1, b = { c = 2, d = { e = 3 } } }
local deepCopyTable = deepCopy(original)

deepCopyTable.b.c = 10
print(original.b.c)      -- 2
print(deepCopyTable.b.c) -- 10

还有一点需要注意的是,在处理递归时如果表中存在循环引用(例如 t = {a = 1}; t.b = t),上述简单实现会导致无限递归。

为了避免上述的这种情况,可以在实现中加入一个“已拷贝表”的映射(seen 表),记录已经拷贝过的表,避免重复拷贝。另外如果表有元表,深拷贝时也需要考虑是否需要拷贝元表,以及如何处理元表中的引用。

下面给出一个改进后实现深拷贝的版本,如下所示:

local function deepCopy(original, seen)
    -- 检查是否为表
    if type(original) ~= "table" then
        return original
    end

    -- 检查是否已经拷贝过
    if seen and seen[original] then
        return seen[original]
    end

    -- 创建新表
    local copy = {}

    -- 记录已经拷贝的表
    seen = seen or {}
    seen[original] = copy

    -- 遍历原表的所有键值对
    for k, v in pairs(original) do
        copy[deepCopy(k, seen)] = deepCopy(v, seen)
    end

    -- 拷贝元表
    local mt = getmetatable(original)
    if mt then
        setmetatable(copy, deepCopy(mt, seen))
    end

    return copy
end

local t = { a = 1 }
t.b = t
local copy = deepCopy(t)
print(copy.b == copy) -- true

使用场景

  • 浅拷贝:当对象的结构简单,并且不包含嵌套的复杂数据类型时可以使用浅拷贝,另外当需要快速复制对象且不介意共享嵌套内容时也适用浅拷贝。

  • 深拷贝:当对象结构复杂,例如包含嵌套的复杂数据类型时且使用过程中需要完全独立的副本,修改副本不影响原对象时需要使用深拷贝。

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Unity 唐老狮 No.5 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

云原生事件驱动架构:构建实时响应的数字化神经系统

引言:重塑企业实时决策能力 Uber实现事件驱动架构升级后,实时供需匹配延迟降至8ms,动态定价策略响应速度提升1200倍。Netflix通过事件流处理实现个性化推荐,用户点击率提高34%,事件处理吞吐量达2000万/秒。Confluent基…

Metasploit multi/handler 模块高级选项解析

multi/handler 是 Metasploit 框架中至关重要的模块,主要用于监听目标机的连接并处理来自目标的反向 shell 或会话。它可以灵活地适应不同渗透测试场景,提供高度的自定义选项以优化监听器的行为。 在 Metasploit msf6 框架中,当使用 exploit…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Spring MVC 程序开发(1)

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么?有什么关系? Servlet 是 java 官方定义的 web 开发的标准规范;Tomcat 是…

C# Unity 唐老狮 No.4 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

Protocol Buffers在MCU上的nanopb介绍及使用详解

在嵌入式系统和资源受限的环境中,传统的Protocol Buffers 可能显得过于庞大。因此,nanopb 应运而生,它是一个轻量级的 Protocol Buffers 生成器,专为嵌入式系统设计c语言设计。本文将介绍如何安装和使用 nanopb,以及通…

(十 二)趣学设计模式 之 享元模式!

目录 一、 啥是享元模式?二、 为什么要用享元模式?三、 享元模式的实现方式四、 享元模式的优缺点五、 享元模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

Trae:国内首款AI原生IDE,编程效率大提升

今年一月,在新闻上看到字节跳动面向海外市场推出了一款名为Trae的AI集成开发环境(IDE)。起初,我并未给予过多关注,因为市面上已有不少IDE集成了AI插件,功能也非常全面,而字节跳动自家的MarsCode…

RocketMQ定时/延时消息实现机制

RocketMQ 的延迟消息是其核心特性之一,允许消息在指定延迟时间后才被消费者消费。 定时消息生命周期 一、延迟消息的核心机制 RocketMQ(5.0之前) 不支持任意时间精度的延迟,而是通过预定义的 延迟级别(Delay Level&a…

基于SpringBoot的校园二手交易平台(源码+论文+部署教程)

运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…

利用 LangChain 和一个大语言模型(LLM)构建一个链条,自动从用户输入的问题中提取相关的 SQL 表信息,再生成对应的 SQL 查询

示例代码: from langchain_core.runnables import RunnablePassthrough from langchain.chains import create_sql_query_chain from operator import itemgetter from langchain.chains.openai_tools import create_extraction_chain_pydantic# 系统消息&#xff…

力扣hot 100之矩阵四题解法总结

本期总结hot100 中二维矩阵的题,时空复杂度就不分析了 1.矩阵置零 原地标记,用第一行和第一列作为当前行列是否为0的标记,同时用两个标签分别记录0行、0列的标记空间中原本是否有0 class Solution:def setZeroes(self, matrix: List[List[…

在Linux上使用APT安装Sniffnet的详细步骤

一、引言 Sniffnet 是一款开源的网络流量监控工具,适用于多种Linux发行版。如果你的Linux系统使用APT(Advanced Package Tool)作为包管理器,以下是如何通过APT安装Sniffnet的详细步骤。 二、系统要求 在开始安装之前&#xff0…

zookeeper-docker版

Zookeeper-docker版 1 zookeeper概述 1.1 什么是zookeeper Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调(Coordination)服务,它是一个为分布式应用提供一致性服务的软件。 1.2 zookeeper应用场景 zookeeper是一个经典的分…

StableDiffusion本地部署 3 整合包猜想

本地部署和整合包制作猜测 文章目录 本地部署和整合包制作猜测官方部署第一种第二种 StabilityMatrix下载整合包制作流程猜测 写了这么多python打包和本地部署的文章,目的是向做一个小整合包出来,不要求有图形界面,只是希望一键就能运行。 但…

数据结构(初阶)(七)----树和二叉树(前中后序遍历)

实现链式结构的二叉树 实现链式结构的二叉树遍历前序遍历中序遍历后序遍历 节点个数叶子节点个数⼆叉树第k层结点个数⼆叉树的深度/⾼度查找值为X的节点二叉树的销毁 层序遍历判断二叉树是否为完全二叉树 ⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。 通常…

科技赋能筑未来 中建海龙MiC建筑技术打造保障房建设新标杆

近日,深圳梅林路6号保障房项目顺利封顶,标志着国内装配式建筑领域又一里程碑式突破。中建海龙科技有限公司(以下简称“中建海龙”)以模块化集成建筑(MiC)技术为核心,通过科技创新与工业化建造深…

json介绍、python数据和json数据的相互转换

目录 一 json介绍 json是什么? 用处 Json 和 XML 对比 各语言对Json的支持情况 Json规范详解 二 python数据和json数据的相互转换 dumps() : 转换成json loads(): 转换成python数据 总结 一 json介绍 json是什么? 实质上是一条字符串 是一种…

计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)

文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:不同的项目基本上就是套用固定模板,换个颜色、改个文字&…