图解python中赋值、浅拷贝、深拷贝的区别!

Python中的id()函数和读取列表的方法 id()函数是Python内置函数之一,用于返回对象的唯一标识符(即对象的内存地址)。在Python中,每个对象都有一个唯一的id,可以通过id()函数获取该对象的id值。上述是一些读取列表的常用方法,可以根据实际需求选择合适的方法来操作列表中的元素。从输出结果可以看出,每个对象都有一个不同的id值。 阅读详情

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。下面本文就通过简单的例子介绍一下这些概念之间的差别。

对象赋值

直接看一段代码:

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = will   Python学习交流群:1004391443
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
  
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

代码的输出为:

 

 

 

 

下面来分析一下这段代码:

  • 首先,创建了一个名为will的变量,这个变量指向一个list对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同)
  • 然后,通过will变量对wilber变量进行赋值,那么wilber变量将指向will变量对应的对象(内存地址),也就是说”wilber is will”,”wilber[i] is will[i]”

可以理解为,Python中,对象的赋值都是进行对象引用(内存地址)传递

  • 第三张图中,由于will和wilber指向同一个对象,所以对will的任何修改都会体现在wilber上

这里需要注意的一点是,str是不可变类型,所以当修改的时候会替换旧的对象,产生一个新的地址39758496

 

 

 

 

浅拷贝

下面就来看看浅拷贝的结果:

import copy
  
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)
  
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
  
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

代码结果为:

 

 

 

 

分析一下这段代码:

  • 首先,依然使用一个will变量,指向一个list类型的对象
  • 然后,通过copy模块里面的浅拷贝函数copy(),对will指向的对象进行浅拷贝,然后浅拷贝生成的新对象赋值给wilber变量

浅拷贝会创建一个新的对象,这个例子中”wilber is not will”

但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”wilber[i] is will[i]”

  • 当对will进行修改的时候

由于list的第一个元素是不可变类型,所以will对应的list的第一个元素会使用一个新的对象39758496

但是list的第三个元素是一个可不类型,修改操作不会产生新的对象,所以will的修改结果会相应的反应到wilber上

 

 

 

 

总结一下,当我们使用下面的操作的时候,会产生浅拷贝的效果:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数

深拷贝

最后来看看深拷贝:

import copy
  
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)
  
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
  
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

代码的结果为:

 

 

 

 

分析一下这段代码:

  • 首先,同样使用一个will变量,指向一个list类型的对象
  • 然后,通过copy模块里面的深拷贝函数deepcopy(),对will指向的对象进行深拷贝,然后深拷贝生成的新对象赋值给wilber变量

跟浅拷贝类似,深拷贝也会创建一个新的对象,这个例子中”wilber is not will”

但是,对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)

例子中will的第三个元素指向39737304,而wilber的第三个元素是一个全新的对象39773088,也就是说,”wilber[2] is not will[2]”

  • 当对will进行修改的时候

由于list的第一个元素是不可变类型,所以will对应的list的第一个元素会使用一个新的对象39758496

但是list的第三个元素是一个可不类型,修改操作不会产生新的对象,但是由于”wilber[2] is not will[2]”,所以will的修改不会影响wilber

 

 

 

 

拷贝的特殊情况

其实,对于拷贝有一些特殊情况:

  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说

也就是说,对于这些类型,”obj is copy.copy(obj)” 、”obj is copy.deepcopy(obj)”

如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

 

 

 

 

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝
Windows11 升级到24H2后,原本的protel99se软件的DDB图纸文件打不开解决办法 Windows11更新后无法打开DDB文件 阅读详情

相关推荐

基于FPGA的ov5640摄像头简易图像采集装置详解

本文介绍一种基于FPGA的,通过流模式DDR实现OV5640摄像头数据采集并显示的方法。

qq_42230252的博客 1万+

python中的常用的几个内置函数

1:内置函数id():返回对象的地址     举例说明: a = 1  print id(1) 输出结果为: 4302632  在这里要注意:数据类型有 可变和不可变的 不可变类型:内存中的那块内容的值不可以被改变。如果重新赋值,就等于创建出一个新的对象:数字、字符串、布尔值、元组 可变类型:内存中的那块内容的值是可以改变的。也不能直接进行新的赋值操作,如:列表(List)字典(Dict...

小鱼儿的博客 533

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

浅谈Python的赋值、深、浅拷贝

一、什么是赋值? 在Python中,赋值需要使用运算符“=”,赋值并不会生成一个新的对象。赋值操作是引用了原变量值的地址。 当原变量的值发生更改时,赋值变量的值也会同步更改。 举个例子: a=5的含义是Python解释器在内存中开辟了一个地址来存储“5”这个值,而a=5实际是变量a在引用该值的地址。这里跟指针很像;b=a,实际上是变量b引用了“5”的地址。a、b变量均指向了同一个地址。附件所示就是赋值变量与原变量指向的地址均一致。 补充:使用新变量将对应的值更改后,老变量的值也会随之更改(赋值操作是引用了

Test_the_rookie的博客 2092

修勾逃生巨人危机v10.9.9修改版:免广告无限内购与GM工具详解

游戏修改技术是通过对原版游戏程序进行代码层面的调整,实现特定功能的增强或限制解除。其核心原理涉及内存修改、资源替换和API拦截等技术手段,能够有效提升用户体验和测试效率。在移动游戏领域,免广告和无限内购是常见的技术实现方向,通过屏蔽广告SDK调用和修改内购验证逻辑,为用户提供更流畅的游戏体验。这类技术特别适合游戏开发者进行功能测试,以及玩家希望完整体验游戏内容而不受商业模式限制的场景。以修勾逃生巨人危机v10.9.9版本为例,该修改版集成了GM工具开启功能,通过特定操作路径即可激活调试面板,实现了广告去除和

weixin_30855099的博客 2619

如何在Windows上安装Node-RED?

Node-RED 是一款基于流程的可视化编程工具,专注于物联网(IoT)和自动化应用的快速开发,其核心特点是通过拖拽节点构建数据流网络,实现低代码/无代码编程。

猿小白的博客 1173

Python赋值、浅拷贝与深拷贝详解(详细分析)

简述 在使用Python语言,通常都会面临对象赋值、参数传递的使用,为了更深入理解它们的底层原理。Python也像其他语言如Java一样引入了浅考本和深拷贝的概念。 首先我们要明确一下:变量存储在栈内存,对象存储在堆内存。 Python数据类型分为可变数据类型和不可变数据类型。 可变数据类型包括:List(列表)、Dictionary(字典)、Set(集合) 不可变数据类型包括:String(字符串)、Number(数字)、Tuple(元组) 浅拷贝: (1)不拷贝子对象的内容,只拷贝子对

weixin_47614014的博客 5753

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

python赋值、深拷贝和浅拷贝的区别详解

一、前言 在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。 二、区别 1、直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变 # 直接赋值 dict_1 = {"key1":[1,2,3,4],"key2":"val2"} dict_2 = dict_1 dict_1["key1"].append(5) print("dict_1内存地址:",id(dict_1

没有一劳永逸,永远要重新开始,重新进入动荡,重新寻找,重新赢得欢喜。 4016

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1164

SAP FICO资产明细表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO资产明细表开发说明书(包括源代码,测试样例及FS)

我好像病了的博客 1472

python---三种赋值方式:等号、浅拷贝、深拷贝

说到三种赋值方式,我们先聊聊有哪些变量是可变的。

weixin_41172713的博客 3462

ICC2:平行打孔create_pg_stapling_vias

power rail(follow pin)不总是metal1一成不变的,当需要使用metal2做power rail,而standard cell的pg pin仍然是metal1时就需要平行打孔,从metal2到metal1。 以往都是用create_pg_vias -allow_parallel_objects来做,但这样有两个弊端,一是需要抓出所有的via12(包括standard cell内部的和出pin绕线产生的),添加routing blockage,防止create pg via的时候产生d

m0_61544122的博客 2260

【Python】赋值、浅拷贝与深拷贝(附图解)

详细分析Python3的赋值、浅拷贝与深拷贝,以简单的例子和一目了然的图解让你对Python的赋值、浅拷贝和深拷贝都有一个深刻的认识

weixin_47383889的博客 980

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

图解python中赋值、浅拷贝、深拷贝的区别

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: will = ["Will", 28, ["Python", "C#", "JavaScript"]] wilber = will print id(will) print will print [id(...

260

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python赋值浅拷贝和深拷贝的区别图片_图解python中赋值、浅拷贝、深拷贝的区别...

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差别的,若是使用的时候不注意,就可能产生意外的结果。下面本文就经过简单的例子介绍一下这些概念之间的差异。app对象赋值函数直接看一段代码:spawill = ["Will", 28, ["Python", "C#", "JavaScript"]]wilber=willprintid(will)printwillprint [id(ele) fo...

weixin_35982453的博客 194

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

图解Python深拷贝和浅拷贝

Python中对象的赋值都是进行对象引用(内存地址)传递使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说如果元祖变量只包含原子类型对象,则不能深拷贝。制了对象,但对于对象中的元素,依然使用原始的引用.

俯κǎń迗倥 803

Python基础:赋值传递中的深浅拷贝问题精讲

本文深入讲解Python中的赋值、浅拷贝和深拷贝概念,重点解析三者区别及使用场景。首先通过实际案例展示直接赋值导致的数据共享问题,随后详细分析:1) 变量是标签而非容器的本质;2) 浅拷贝创建新容器但共享内部元素;3) 深拷贝实现完全独立复制。文章通过大量代码示例和内存图示,演示了列表、字典、集合等可变对象的拷贝行为,特别指出浅拷贝的"浅"体现在仅复制第一层结构。最后强调在实际开发中,应根据数据结构复杂度选择适当的拷贝方式以避免意外修改。

输出倒逼输入,写作驱动成长。 7893

python赋值复制_图解python中赋值、浅拷贝、深拷贝的区别

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。下面本文就通过简单的例子介绍一下这些概念之间的差别。对象赋值直接看一段代码:will = ["Will", 28, ["Python", "C#", "JavaScript"]]wilber=willprintid(will)printwillprint [id(ele) for ele in...

weixin_39679664的博客 96

Python 玩转数据 5 - 图解 Python 赋值,浅拷贝 copy.copy() 和 深拷贝 copy.deepcopy() 原理

我们来深入研究一下 Python 赋值,拷贝的原理,有涉及到可变类型和不可变类型的不同处理。

wumingxiaoyao的博客 2328

图解Python中的浅拷贝和深拷贝

如果要将一个数据赋给另一个数据要怎么做呢?最直观的一种方法是使用 =,另一种方法使用copy(),另一种是使用copy库中的deepcopy()。那么这三种方法有什么区别呢?下面我们通过图示的方法来看一下。 文章目录1. Python中的浅拷贝1.1 = 赋值1.2 copy()2. Python中的深拷贝3. 参考 1. Python中的浅拷贝 1.1 = 赋值 假设定义一个三维数组a = [1,2,3, [1,2,3, [5,6,7]]],如果使用=将其赋给另一个变量b,那么a和b会有什么不同呢?.

Forlogenの解忧杂货铺 759

图解python_图解 Python 深拷贝和浅拷贝

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。下面本文就通过简单的例子介绍一下这些概念之间的差别。对象赋值直接看一段代码:Pythonwill = ["Will", 28, ["Python", "C#", "JavaScript"]]wilber = willprint id(will)print willprint [id(ele) ...

weixin_39977642的博客 203

python怎么复制图片_图解 Python 深拷贝和浅拷贝

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。下面我们按照原文,细细理解下这些差别:对象赋值我们看下面的的代码部分:In [1]: will = ["will",28,["python","C#","Javascript"]]In [2]: wilber = willIn [3]: id(will)Out[3]: 233572790509...

weixin_35710893的博客 2544

【转载】图解 Python 深拷贝和浅拷贝

【转载】 图解 Python 深拷贝和浅拷贝 2015/09/28 · 基础知识

六师兄_的博客 581
上一篇: 如何基于 Flink 与 TensorFlow 构建实时智能异常检测平台?
下一篇: python实现自动登录discuz论坛!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值