python可变和不可变

article/2025/6/24 20:16:42

python进阶笔记

  • 一、python中的可变和不可变
  • 二、简单可变类型拷贝
      • 1、Python的深浅拷贝
      • 2、深浅拷贝具体代码实现
  • 三、复杂可变类型拷贝
  • 四、简单不可变类型拷贝
  • 五、复杂不可变类型拷贝
    • 1、不可变类型的深浅拷贝-嵌套类型
  • 六、切片拷贝,字典拷贝
    • 1、切片拷贝
    • 2、字典拷贝
  • 六、import导入模块路径问题
  • 七、import的reload加载问题

一、python中的可变和不可变

目标

能够说出可变和不可变的区别

可变、不可变是指内存中的那块空间是否可以被改变
1、可变类型,创建后可以继续修改对象的内容(值)

字典,列表

2、不可变类型,一旦创建就不可修改的对象(值)

数字,字符串,元组
当内容发生修改,计算机重新分配一块内存空间

二、简单可变类型拷贝

目标

知道简单可变类型深浅拷贝的空间产生情况
为保证数据的独立性,在开发中我们希望两个变量值一样,而且互不影响,这就需要使用到拷贝技术了

1、Python的深浅拷贝

python里的copy模块可以实现拷贝功能
在这里插入图片描述

拷贝的作用

1、可以减少内存的使用
2、以后在做数据的清洗,修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。

2、深浅拷贝具体代码实现

针对可变类型,深浅拷贝都会产生一个新的空间
copy()浅拷贝,产生新的空间,能够保证数据的独立性

import copy
list1=[1,2,3]
print("list1=",list1,id(list1))
#浅拷贝
list2=copy.copy(list1)
print("list2=",list2,id(list2))
#修改list1
list1.append(5)
print("list1=",list1,id(list1))
print("list2=",list2,id(list2))
结果为:
list1= [1, 2, 3] 2350069862720
list2= [1, 2, 3] 2350069864128
list1= [1, 2, 3, 5] 2350069862720
list2= [1, 2, 3] 2350069864128

总结

list1修改不会改变list2,因为是两个不同的空间

但是list1修改的话,地址不会变,这样就会引起混乱

deepcopy()深拷贝,产生新的空间,能够保证数据的独立性

#深拷贝
list1=[1,2,3]
print("list1=",list1,id(list1))
list2=copy.deepcopy(list1)
print("list2=",list2,id(list2))
#修改list2
list2.append(7)
print("list2=",list2,id(list2))
print("list1=",list1,id(list1))
结果为:
list1= [1, 2, 3] 2533638211392
list2= [1, 2, 3] 2533641050048
list2= [1, 2, 3, 7] 2533641050048
list1= [1, 2, 3] 2533638211392

三、复杂可变类型拷贝

浅拷贝

import copy
A=[1,2,3]
B=[11,22,33]
C=[A,B]
print("A=",A,id(A))
print("B=",B,id(B))
print("C=",C,id(C))
print("C[0]=",C[0],id(C[0]))
#对复杂可变类型进行浅拷贝
#D产生了新的空间
D=copy.copy(C)
print("D=",D,id(D))
print("D[0]=",D[0],id(D[0]))
#修改A的值
A[0]=10
print("D[0]=",D[0],id(D[0]))
结果为:
A= [1, 2, 3] 1802054422656
B= [11, 22, 33] 1802051952448
C= [[1, 2, 3], [11, 22, 33]] 1802054424064
C[0]= [1, 2, 3] 1802054422656
D= [[1, 2, 3], [11, 22, 33]] 1802054542592
D[0]= [1, 2, 3] 1802054422656
D[0]= [10, 2, 3] 1802054422656

总结

浅拷贝只复制最顶层数据
在这里插入图片描述
深拷贝

#深拷贝
A=[1,2,3]
B=[11,22,33]
C=[A,B]
print("A=",A,id(A))
print("B=",B,id(B))
print("C=",C,id(C))
print("C[0]=",C[0],id(C[0]))
D=copy.deepcopy(C)
print("D=",D,id(D))
print("D[0]=",D[0],id(D[0]))
#修改A的值
A[0] = 10
print("A=", A, id(A))
print("D[0]=", D[0], id(D[0]))
结果为:
A= [1, 2, 3] 2464027445056
B= [11, 22, 33] 2464030281984
C= [[1, 2, 3], [11, 22, 33]] 2464030283456
C[0]= [1, 2, 3] 2464027445056
D= [[1, 2, 3], [11, 22, 33]] 2464030402624
D[0]= [1, 2, 3] 2464030402816
A= [10, 2, 3] 2464027445056
D[0]= [1, 2, 3] 2464030402816

总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViWtDDyQ-1649582820396)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1649426346064.png)]

四、简单不可变类型拷贝

目标

知道简单不可变类型都是浅拷贝

不可变类型,不管是深拷贝还是浅拷贝,都不会开辟新的空间,而是直接引用了被拷贝的数据的地址
浅拷贝

import copy
tuple1=(1,2,3)
print("tuple1=",tuple1,id(tuple1))
tuple2=copy.copy(tuple1)
print("tuple2=",tuple2,id(tuple2))
结果为:
tuple1= (1, 2, 3) 2001449933952
tuple2= (1, 2, 3) 2001449933952

深拷贝

import copy
tuple1=(1,2,3)
print("tuple1=",tuple1,id(tuple1))
tuple2=copy.deepcopy(tuple1)
print("tuple2=",tuple2,id(tuple2))
结果为:
tuple1= (1, 2, 3) 2507813313536
tuple2= (1, 2, 3) 2507813313536

五、复杂不可变类型拷贝

1、不可变类型的深浅拷贝-嵌套类型

浅拷贝

import copy
A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=copy.copy(C)
print("D=",D,id(D))
print("D[0]=",id(D[0]),"C[0]=",id(C[0]),"A=",id(A))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 1572978640768
D= ([1, 2, 3], [11, 22, 33]) 1572978640768
D[0]= 1572981461312 C[0]= 1572981461312 A= 1572981461312

深拷贝

import copy
A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=copy.deepcopy(C)
print("D=",D,id(D))
print("D[0]=",id(D[0]),"C[0]=",id(C[0]),"A=",id(A))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 2603209148288
D= ([1, 2, 3], [11, 22, 33]) 2603211969920
D[0]= 2603212080064 C[0]= 2603211970112 A= 2603211970112

六、切片拷贝,字典拷贝

1、切片拷贝

A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=C[:]
print("D=",D,id(D))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 1814156363648
D= ([1, 2, 3], [11, 22, 33]) 1814156363648

底层为浅拷贝方式

2、字典拷贝

import copy
dict1={"age":[1,2]}
print("dict1=",dict1,id(dict1))
dict2=dict1.copy()
print("dict2=",dict2,id(dict2))
dict1['age'][0]=100
print("dict1=",dict1,id(dict1))
print("dict2=",dict2,id(dict2))
结果为:
dict1= {'age': [1, 2]} 2850238566144
dict2= {'age': [1, 2]} 2850241455552
dict1= {'age': [100, 2]} 2850238566144
dict2= {'age': [100, 2]} 2850241455552

底层为浅拷贝

dict1['age'][0]=100
print("dict1=",dict1,id(dict1))
print("dict2=",dict2,id(dict2))
结果为:
dict1= {'age': [1, 2]} 2850238566144
dict2= {'age': [1, 2]} 2850241455552
dict1= {'age': [100, 2]} 2850238566144
dict2= {'age': [100, 2]} 2850241455552

底层为浅拷贝

六、import导入模块路径问题

目标

知道如何导入指定目录下的模块

存在的问题:

当我们把模块文件放在工程文件的外部,发现无法正常引入模块

原因:

外部的文件夹的路径,没有放到环境变量中

解决方法:

1、导入sys模块
2、sys.path查看环境变量,返回值是列表
3、把自己写的模块的路径加到环境变量中:sys.path.append(path)追加到末尾
sys.path.insert(0,path)追加在第一条

注意:

这不是永久修改,只是临时修改,不过工作上一般都是运行的时候才修改,永久修改会把环境变量搞的乱糟糟

七、import的reload加载问题

目标

能够说出reload的作用

存在的问题:

import导入模块后,如果模块被修改,此时再次import不起作用,import自动防止重复导入,强制重新加载模块,使用reload()函数

解决方案
在这里插入图片描述


http://chatgpt.dhexx.cn/article/KbwRwe1R.shtml

相关文章

vsftpd 配置(中)

原贴:http://www.ititgo.cn/news_view.asp?newsid575 vsftpd 配置(中) 录入员:admin 来源: 加入时间:2007-6-4 11:30:32 点击:274 <script type"text/javascript"> </script> <script src"http://pagead2.googlesyndication.com/pagead/show_…

linux vsftpd 模式,Linux下的Vsftpd配置篇

1.主动与被动模式 1)主动模式(PORT方式) 连接过程为:客户端向服务器FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:我打开了XX端口,你过来连接我,于是服务器从20号端口向客户端的XX端口发送…

ftp服务器vsftpd配置文件,最全面的vsftpd配置文件详解

最详细的vsftpd配置文件&#xff0c;分享给大家。 注意&#xff1a; 使用匿名登入时&#xff0c;所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性&#xff0c;即匿名用户的家目录不能有777的权限。 对于用户的访问控制可以通过/etc/vsftpd目录下的vsftpd.user…

ftp服务器vsftpd配置文件,vsftpd配置文件详解及ftp服务器搭建

本文介绍如何在linux上搭建ftp服务器&#xff0c;并且给出了vsftpd 的配置的中文详解&#xff0c;要搭建ftp的同学可以认真看看&#xff0c;其中的配置文件必备全部记忆&#xff0c;在以后配置时可以查看这篇文章。 一、vsftps服务器的配置文件中文详解 vsftps服务器的配置文件…

大数据所具备的四个特点,清楚知道大数据原理原则

说起大数据&#xff0c;估计大家都觉得只听过概念&#xff0c;但是具体是什么东西&#xff0c;怎么定义&#xff0c;没有一个标准的东西&#xff0c;因为在我们的印象中好像很多公司都叫大数据公司&#xff0c;业务形态则有几百种&#xff0c;感觉不是很好理解&#xff0c;所以…

计算机存储容量的基本单位pb,pb存储单位是什么

pb存储单位是一种计算机存储单位&#xff0c;pb的英文全称是Petabytes&#xff0c;其中文名叫拍字节&#xff1b;计算机存储单位一般用字节Byte、千字节KB、兆字节MB、吉字节GB、太字节TB、拍字节PB、艾字节EB等表示。 本文操作环境&#xff1a;Windows7系统&#xff0c;Dell G…

zb计算机术语,容量1zb等于多少kb

满意答案 nnn08nnn08 2017.05.28 采纳率&#xff1a;57% 等级&#xff1a;9 已帮助&#xff1a;115人 1KB1024B&#xff1b;1MB1024KB10241024B。其中1024210。  1B(byte&#xff0c;字节)8bit(见下文)&#xff1b;  1KB(Kibibyte&#xff0c;千字节)1024B2^10B&#xf…

计算机存储1pb等于多少kb,存储容量:1TB等于多少GB?1PB等于多少TB?1EB等于多少PB?

满意答案 youki203. 2013.09.11 采纳率&#xff1a;45% 等级&#xff1a;11 已帮助&#xff1a;12389人 存储容量:是该存储设备上可以存储数据的最大数量&#xff0c;通常使用千字节(kb kilobyte)、兆字节(MB megabyte)、吉字节(GB, gigabyte)、太字节(TB &#xff0c;terab…

word中如何快速引用参考文献

最近一直忙于论文的修改&#xff0c;在修改过程中发现参考文献引用是一个问题&#xff0c;下面结合网上的资源给出了如何快速引用参考文献。 主要分为两大步骤&#xff0c;生成编号项、插入超级链接 1、自动生成编号项 1.1、选种参考文献区域&#xff0c;如下图&#xff1a;…

Word 2016 撰写论文(2): 交叉引用

在利用Word编辑论文时&#xff0c;谁也不可能保证自己撰写的文档会一次性成功&#xff0c;不做任何修改&#xff0c;这就避免的会碰到增加或删减某些图片或表格的情况&#xff0c;以及对插入图片的顺序进行变更&#xff0c;这就产生一个问题&#xff0c;为了是文档产生图文并茂…

Word引用文献设置双向链接

1. 修改参考文献编号格式 2. 选中正文中引用的标号例如&#xff1a; 3. 保持选中的状态下&#xff0c;点击引用&#xff1a; 4. 再点击交叉引用&#xff1a; 5. 引用内容选择“段落编号(完整上下文)”&#xff0c;然后选择具体的引用文献&#xff1a; 6. 如果要在两条文献之中…

如何更新word文档中的文献引用编号?

最近用word写毕业论文&#xff0c;遇到一个小问题&#xff0c;就是使用 “交叉引用” 引用参考文献的时候&#xff0c;文档中插入的编号不能随参考文献的实际编号变化而变化。简单的搜索后&#xff0c;找到了一个方法&#xff0c;在此记录一下&#xff0c;以备后用。怎样在Word…

word参考文献交叉引用的多项引用,改逗号和破折号形式

word参考文献交叉引用的多项引用&#xff0c;如&#xff1a;[1][2][3]-->[1-3]&#xff0c;[1][3][4][5]-->[1,3-5] 1 引用2个参考文献2 引用三个&#xff08;及以上&#xff09;连续序号的参考文献总结 1 引用2个参考文献 1.1 按步骤1&#xff0c;2&#xff0c;3&#…

Word中的参考文献引用

选中参考文献选择【段落】–》【段落编号】 最终效果 引用方法&#xff1a;单击【引用】–》【交叉引用】–》选择【插入】

【Word】如何设置交叉引用标注参考文献与设置上标

【Word】如何设置交叉引用标注参考文献与设置上标 本文目录 前言1、定义参考文献编号的格式2、设置交叉引用&#xff0c;插入正文位置3、连续修改多个参考文献的相关格式4、更新正文标注5、注意事项1&#xff1a;论文参考文献从10开始无法对齐总结 前言 这周在写论文的时候&am…

word如何给论文加引用文献

给论文加引用文献其实差不多就是加了个链接&#xff0c;通过点击链接跳转到文末最后展示引用文献额作者&#xff0c;论文名等等信息&#xff0c;给论文加引用文献只要有一下几步&#xff1a; 一、设置参考文献标号字体格式 对于论文中的文献&#xff0c;首先设置论文前序号的…

Word引用参考文献上标,全标注批量设置为上标

请看范例图片&#xff0c;下图为论文中某一段落&#xff0c;引用了三篇文献&#xff0c;并已经通过【交叉引用】来添加文献编号注释&#xff0c;我们要对这些编号进行上标设置。 一般&#xff0c;我们可以选中标注后&#xff0c;点击上方的上标。 这样的操作&#xff0c;面…

【word】如何设置交叉引用标注参考文献

文章目录 1. 定义参考文献编号格式2. 设置交叉引用&#xff0c;插入正文位置3. 修改连续多个参考文献的格式4. 更新正文标注 1. 定义参考文献编号格式 【开始】->【编号】->【定义新编号格式】 2. 设置交叉引用&#xff0c;插入正文位置 设置好固定的参考文献格式&…

所有word引用列表出现“ADDIN EN.REFLIST”解决办法

文章目录 问题描述解决办法 问题描述 使用论文管理工具插入论文后&#xff0c;有时候可能会在引用列表突然出现“ADDIN EN.REFLIST” 解决办法 在word的操作栏里&#xff0c;依次点击&#xff1a; 文件选项高级取消勾选“显示域代码而非域值”