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

news2024/10/17 17:18:56

赋值

        在 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.coloradmin.cn/o/2216061.html

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

相关文章

Java基础:面向对象编程3

1 Java可变长参数 1.1 概述 Java 的可变长参数(Varargs)是在 Java 1.5 中引入的功能,允许方法接受任意数量的相同类型的参数。可变参数的语法是在参数类型后面加上三个点(...),例如 int... numbers。 1.…

Zsh 安装与配置

目录 1 环境配置 1.1 基本工具安装 1.2 安装 oh-my-zsh 1.3 从.bashrc中迁移配置(可选) 2 主题配置 2.1 内置主题 2.2 自定义主题 2.2.1 推荐主题 3 插件安装 3.1 推荐插件 3.1.1 zsh -autosuggestions 3.1.2 zsh-syntax-highlighting 3.2 启…

kubernetes中的微服务

目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…

【数据结构】1.顺序表

「前言」 🌈个人主页: 代码探秘者 🌈C语言专栏:C语言 🌈C专栏: C 🌈喜欢的诗句:天行健,君子以自强不息. 线性表 线性表(List):零个或多个数据元素的有限序列…

软考(网工)——数据通信基础

🕐信道特性 1️⃣概念 通信得目的就是传递信息。通信中产生和发送信息得一端叫信源,接受信息的一段叫信宿,信源和信宿之间的通信线路称为信道。 2️⃣信道带宽 W 模拟信道:Wf2-f1(f2 和 f1分别表示:信道…

树的中心——dfs

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M N*2; int h[N], e[M], ne[M], idx; int n; int ans 2e9; bool st[N]; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } int dfs(int u) {int…

芯片记录一下

1、MC34063 电源管理DCDC 输入电压&#xff1a;-0.3~40V 输出电压&#xff1a;Vout1.25*&#xff08;1R2/R1&#xff09; 1.25V~40V

【报错解决】安装scikit-rebate包报错

scikit-rebate ReBATE是一套基于Relief的机器学习特征选择算法 报错信息 解决方案 conda install numpy scipy scikit-learnpip install skrebate依次运行以上两步&#xff0c;即可成功安装&#xff01;

如何实时监测你的光纤资源?

光纤资源作为重要的通信基础设施&#xff0c;实时监测光纤资源的状态是运营管理好光纤资源的重要手段&#xff0c;那常用的监测指标维度与方法有那些呢&#xff1f; 维度1&#xff1a;资源数量 资源数量主是建立资源的基础档案&#xff0c;掌握光缆的型号、路由&#xff1b;光…

健康推荐系统:SpringBoot技术实现

3系统分析 3.1可行性分析 通过对本基于智能推荐的卫生健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于智能推荐的卫生健康系统采用SSM框架&#…

python 位运算 笔记

起因&#xff0c; 目的: 位运算&#xff0c;令我头疼的地方。算法题里面也是经常见到。 位运算。 按位或&#xff0c;OR, | , 只要有一个为1&#xff0c; 结果就是1&#xff0c;否则为0按位异或&#xff0c;XOR, ^, 2个数不同&#xff0c;结果为1&#xff0c; 否则为0&#…

k8s jenkins 2.421动态创建slave

k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势&#xff1a;制作jenkins-slave从节点jenkins-slave-latest:v1配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤&#xff0c;目前大多公司都采…

《OpenCV计算机视觉》—— 使用DNN模块实现图片风格迁移

文章目录 OpenCV中的DNN模块一、功能概述二、支持的模型格式三、基本使用方法四、DNN 模块的特点五、常见应用示例 示例&#xff1a;图片风格迁移 OpenCV中的DNN模块 OpenCV中的DNN&#xff08;Deep Neural Network&#xff09;模块是一个功能强大的工具&#xff0c;它允许开发…

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅&#xff0c;直接pip安装依赖&#xff1a; pip install -r requirements.txt 如果需要国内的镜像&#xff0c;可以考虑使用阿里的&#xff0c;在后面加上&#xff1a; -i http://mirrors.aliyun.com/pypi/simple --…

Linux--多路转接之epoll

上一篇:Linux–多路转接之select epoll epoll 是 Linux 下多路复用 I/O 接口 select/poll 的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。它是 Linux 下多路复用 API 的一个选择&#xff0c;相比 select 和 poll&#xff0c…

自建 Bitwarden 密码管理器

大佬零度解说的文件修改,与原文不太一样,详细请看&#xff1a;自建 Bitwarden 密码管理器&#xff01;完全免费开源&#xff0c;轻量级&#xff0c;安全又可靠&#xff01;-零度解说 教程&#xff1a;你的密码真的安全吗&#xff1f;Bitwarden 密码管理器&#xff01;一键部署…

【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略

Redis常见问题总结&#xff1a; Redis常见问题总结Redis缓存预热Redis缓存雪崩Redis缓存击穿Redis缓存穿透 Redis 中 key 的过期删除策略数据删除策略 Redis内存淘汰策略一、Redis对过期数据的处理&#xff08;一&#xff09;相关配置&#xff08;二&#xff09;内存淘汰流程&a…

el-table表格里面有一条横线

表格里面 有一条横线&#xff0c; 出现原因&#xff1a;是自定义了表格头.使用了固定列&#xff08;fixed&#xff09;&#xff0c;定宽。就很难受。。。 添加样式文件&#xff1a; <style lang"scss" scoped>::v-deep {.el-table__fixed-right {height: 100%…

植物大战僵尸杂交版之后要出联机版植物大战僵尸?(内测中,可在安卓手机上玩,文末附下载链接)

继植物大战僵尸杂交版之后给大家介绍一个杂交版作者正在酝酿的“植物大战僵尸射击版” 植物大战僵尸射击版介绍 《植物大战僵尸杂交版》的创作者“潜艇伟伟迷”即将推出PVZ改版新作——《植物大战僵尸射击版》。游戏将支持PC、手游和web端&#xff0c;提供单人、双人、三人、…

取证之FTK Imager学习笔记

一、FTK Imager制作镜像详细教程 1、文件-创建磁盘镜像 2、参数详解&#xff1a; 1&#xff09;物理驱动器 整个驱动器&#xff0c;如&#xff1a;识别到的是整块硬盘、U盘等&#xff0c;而不管你分几个分区&#xff1b; 2&#xff09;逻辑驱动器&#xff08;L&#xff09…