python深浅拷贝,可变变量与不可变变量

赋值

        在 python 中,赋值是将一个值或对象分配给一个变量的过程。赋值操作符是 =,用于将右侧的值或对象赋给左侧的变量。

赋值:l2的值会随着原对象l1的值一同改变

l1 = [1, 2, 3, 4]
print('l1:', l1)
l2 = l1
print('l2:', l2)


给li列表新增元素

l1.append(5)
print('l1', l1)
print('l2', l2)  

输出后可以看到l1和l2两个列表同时增加了5


 赋值等于完全共享资源,一个值的改变会完全被另一个值共享

深浅拷贝:

        在 Python 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用来复制对象的两种方式,它们的主要区别在于如何处理对象内部的嵌套结构(如列表、字典、对象等)。

浅拷贝

        创建一个新对象,但不递归地复制嵌套对象。换句话说,它创建了一个新的容器对象,并插入了对原始对象中元素的引用。如果嵌套对象(如列表中的列表)被修改,原始对象中的内容也会受到影响。浅拷贝的数据半共享。浅拷贝会创建一个新的对象,拷贝第一层的数据,嵌套层会指向原来的内存地址

import copy  # 导入copy模块l1 = [1, 2, 3, [4, 5, 6]]  # 定义一个嵌套列表
l2 = copy.copy(l1)
print('l2', l2)


 查看内存地址

print('l1的内存地址:', id(l1))
print('l2的内存地址:', id(l2))


 内存地址不一样,说明不是同一个对象

往列表增加元素

l1.append(8)
print('l1', l1)
print('l2', l2)
# 往嵌套列表增加元素
l1[3].append(7)
print('l1', l1)
print('l2', l2)
print('l1[3]的内存地址:', id(l1[3]))
print('l2[3]的内存地址:', id(l2[3]))


外层的内存地址不同,但是内层的内存地址相同
优点:拷贝速度快,占用空间少,拷贝效率高

深拷贝

        创建一个新对象,同时递归地复制嵌套对象。也就是说,深拷贝会创建所有对象的完整副本,包括所有的嵌套对象。深拷贝的数据完全不共享。外层的对象和内部的元素都拷贝了一遍
import copy  # 导入copy模块

l1 = [1, 2, 3, [4, 5, 6]]  # 定义一个嵌套列表
l2 = copy.deepcopy(l1)  # 深拷贝
print('l1', l1)
print('l2', l2)
print('l1[3]的内存地址:', id(l1[3]))
print('l2[3]的内存地址:', id(l2[3]))

往列表添加元素

l1.append(8)
print('l1', l1)
print('l2', l2)
# 往嵌套列表增加元素
l1[3].append(7)
print('l1', l1)
print('l2', l2)
print('l1[3]的内存地址:', id(l1[3]))
print('l2[3]的内存地址:', id(l2[3]))


 深拷贝数据变化只影响数据本身,跟原来的对象没有关系

总结

  • 浅拷贝

    • 只复制对象本身,嵌套对象仍然引用原始对象。
    • 使用 copy.copy()
  • 深拷贝

    • 递归复制所有嵌套对象,创建完整的独立副本。
    • 使用 copy.deepcopy()

可变对象


含义:存储空间保存的数据允许被修改,但是内存地址不会改变,这种数据就是可变类型
常见的可变类型:

  1. 列表(List)
  2. 字典(Dictionary)
  3. 集合(Set)

列表
l1 = [1, 2, 3, 4]
print('l1的原内存地址:', id(l1))
l1.append(5)
print(l1)
print('l1的现内存地址:', id(l1))
# 原内存地址与现内存地址相同

 字典
dic = {'name': 'elysia', 'age': 18}
print(dic, id(dic))
dic['name'] = 'seele'
print(dic, id(dic))
# 原内存地址与现内存地址相同

集合
set = {1, 2, 3, 4, 5}
print(set, id(set))
set.remove(3)
print(set, id(set))
# 原内存地址与现内存地址相同

不可变对象


 含义:变量相应的值不能被修改,如果修改就会生成一个新的值从而分配新的内存空间

常见的不可变对象有:

  1. 整数(Integer)
  2. 浮点数(Float)
  3. 字符串(String)
  4. 元组(Tuple)
整型
n = 10  # 整型
print('int原地址:', n, id(n))
n = 15
print('int修改后的地址:', n, id(n))
#内存地址不一样,修改n的值就会生成新的值,重新赋值给变量n
字符串
name = 'elysia' #字符串类型
print('str原地址:', id(name))
name = 'seele'
print('str修改后的地址:', id(name))

元组
name = ('e','l','y','s','i','a')
print('tuple原地址:', id(name))
name = ('s','e','e','l','e')
print('tuple修改后的地址:', id(name))

 注意:前面的深浅拷贝只针对可变对象,不可变对象不支持,也没有拷贝的说法

影响: 

  1. 性能:由于不可变对象的每次修改都需要创建新对象,因此在处理大量数据时,性能可能会受到影响。
  2. 哈希:不可变对象可以作为字典的键,因为它们的哈希值在其生命周期内是稳定的。可变对象不能作为字典的键。
  3. 多线程安全:不可变对象在多线程环境下更安全,因为它们的值不能被改变

可变与不可变对象的区别

特性可变对象不可变对象
修改内容可以在原地修改内容无法修改,任何修改都会创建新对象
内存地址变化地址保持不变修改后地址会变化
使用场景适合需要频繁修改的场景适合需要保证数据不被改变的场景

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

前言:Hello大家好,我是小哥谈。自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型,旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了,构建简单的应用程序需要很长时间。尽管如此,Jav…

论文翻译 | OpenICL: An Open-Source Framework for In-context Learning

摘要 近年来,上下文学习(In-context Learning,ICL)越来越受到关注,并已成为大型语言模型(Large Language Model,LLM)评估的新范式。与传统微调方法不同,ICL无需更新任何参…

龙信科技:引领电子物证技术,助力司法公正

文章关键词:电子数据取证、电子物证、手机取证、计算机取证、云取证、介质取证 在信息技术飞速发展的今天,电子物证在司法领域扮演着越来越重要的角色。苏州龙信信息科技有限公司(以下简称“龙信科技”)作为电子数据取证领域的先…

bat(批处理脚本学习)

输出banner echo off echo () echo JL echo ^|^| echo LJ echo _,--"""""""---. echo , …

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么?1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

【C语言】分支结构switch

switch分支语句 多适用于明确表达式结果的情况&#xff0c;多个分支&#xff0c;用if过于繁琐。 case后跟具体的表达式值&#xff0c;break&#xff1b;跳出分支语句。 #include <stdio.h> #include <math.h> /* 功能&#xff1a;选择结构&#xff08;switch&…

Qt初识_项目文件解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_项目文件解析 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. pro文件解析 2.…

java异步多线程Async学习记录

java异步多线程Async学习记录 第1步:声明线程池AsyncConfiguration import org.springframework.context.annotation.Bean; import org.springframework

vue+element的confirm提示消息文字变色和换行

效果: 思路: 可以考虑采用模板字符串的思路实现 代码: this.confirm(您确定要<b style"Color: red">${text}</b>的数据项&#xff1f;<br/>单位名称: ${row.companyName} <br/>属性: ${row.attributeName}).then(() > {console.log(确定…

SCM供应商管理怎么做?

在企业的供应链管理中&#xff0c;供应商管理是至关重要的一环。然而&#xff0c;传统的供应商管理方式常常面临诸多痛点&#xff0c;导致管理效率低下、成本增加、风险增大。不注重供应商管理的企业&#xff0c;常常会面临以下问题&#xff1a; 供应商档案管理难&#xff1a;…

Redis 五种数据类型的操作命令

一、五种数据类型的介绍 五种数据类型如图所示&#xff1a; Redis 是一个开源的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;每种数据结构都有其特定的用例和底层实现。以下是 Redis 的五种主要数据类型&#xff0c;以及它们适合存储的数据类型和底层实现&#xf…

健康生活的重要性

在当今快节奏的生活中&#xff0c;养生保健已成为人们日益关注的话题&#xff0c;而健身作为其中的重要一环&#xff0c;更是被赋予了前所未有的重视。谈及养生保健与健身&#xff0c;我们不得不深入思考&#xff1a;如何在繁忙的日常中&#xff0c;找到那条通往健康与活力的道…

MAC地址漂移实验

MAC地址漂移实验的概述&#xff1a; MAC地址漂移实验的概述主要围绕网络设备中的MAC地址动态变化及其检测与防护措施。以下是对MAC地址漂移实验的具体介绍&#xff1a; MAC地址漂移的定义&#xff1a;MAC地址漂移是指在同一个VLAN内&#xff0c;一个MAC地址被交换机的两个不同…

【哈希】1. leetcode 1. 两数之和

1 题目描述 题目链接&#xff1a;两数之和 2 题目解析 一般的思维&#xff1a;找到两个数A和B&#xff0c;判断A和B相加是否为target。 我们可以采用逆向思维&#xff1a;找到一个数A&#xff0c;在nums数组中找是否有值等于target - A&#xff0c;因为题目要求只返回一个…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可&#xff0c;一定要在MainWindows或者Widget的下面&#xff01; 观察图标变化 带有禁止的意思是分拆布局&#xff08;当前无布局&#xff09; 现在是添加布局后了 注意&#xff1a;一定是在MainWindows或Widget才可以添加顶层布局&#xff0c;才可以实现…

Flutter技术学习

以下内容更适用于 不拘泥于教程学习&#xff0c;而是从简单项目入手的初学者。 在开始第一个项目之前&#xff0c;我们先要了解 两个概念。 Widget 和 属性 Widget 是用户界面的基本构建块&#xff0c;可以是任何 UI 元素。属性 是 widget 类中定义的变量&#xff0c;用于配…

linux 效率化 - zsh + tmux

文章目录 简介涉及的资料/代码仓库让我们开始吧1. Oh my Zsh!2. 终端主题 - powerlevel10k &#xff08;赋能优雅终端界面&#xff09;3. Oh my Tmux!安装完成&#xff0c;再加点料1. tmux2. zsh 结语进阶配置&#xff08;发烧友关注&#xff09;zsh-vim-mode&#xff08;终端支…

拉拢商家、直播PK,这届双11开始卷平台

文丨郭梦仪 在一声声“上链接”中&#xff0c;不少网友在昨晚已经成为了第一批“尾款人”。第一份战报也在今日傍晚发出。 据天猫双11战报显示&#xff0c;活动首小时&#xff0c;大家电整体成交同比去年双11预售同期暴涨765%。仅开售4小时&#xff0c;老板、TCL、西门子、方太…

【Docker】安装部署项目流程(Pycharm版)

安装部署步骤 1.准备项目 第一步要准备好你所需要部署的项目&#xff0c;确保在工作目录下所以程序.py文件正常调用并能正确运行 如上&#xff0c;main要在工作目录中能跑通&#xff0c;这里有一点需要注意 在IDE src不要标记为源代码根目录&#xff0c;观察一下是否能跑通代…