day07 深浅拷贝
今日概要
- 深浅拷贝(重点)
- 文件操作
详细内容
直接赋值: 直接将对象的引用赋值给另一个对象
v1=1000
v2=v1
#v1 v2指向同一个内存地址
print(id(v1),id(v2))#相等
v1="new_value
print(id(v1),id(v2))#不等 v1=[1,2,3]
v2=v1
##v1 v2指向同一个内存地址
v1.append("45")
print(v2)
#[1,2,3,4,5]
##v1 v2指向同一个内存地址 修改v1内存地址的内容 v2也会跟着改变

解析:
变量中存放的都是引用地址
当创建v1并赋值的时候,会在内存空间开辟一小块内存空间比如(001):001=1000
v1存放该1000内存地址
当v2=v1的时候 将该内存地址又给了v2 ==>v2也指向 001 地址 ==> v2==1000
当v1="新变量时候" 因为 001存放的1000是不可变类型 v1需要另外开辟空间004:存储"new_value"
此时v2还是指向001内存地址浅拷贝: 只拷贝父对象,不会拷贝子对象(只会copy一层)
深拷贝:会拷贝到所有嵌套的子对象
不可变类型的copy
按理说会另外开辟一块空间存放v2的“alex”值 ,但是由于小数据缓存池原因,使“alex”只会占用一个内存,所以v2和v1地址相等
#1.字符串及其int型的copy
v1="alex"
import copy
v2=copy.copy(v1)
print(id(v1),id(v2))#相等 #按理说会另外开辟一块空间存放v2的“alex”值 ,但是由于小数据缓存池原因,使“alex”只会占用一个内存,所以v2和v1地址相等 #2.字符串及其int型deepcopy
v3=copy.deepcopy(v1)
print(id(v1),id(v2))
#同理 地址相等列表列表,集合,字典的拷贝
#1.赋值
v1=[1,2,3]
v2=v1
print(v2 is v1)#True
v1.append("a")
print(v1,v2)
#[1,2,3,"a"]-->v1
#[1,2,3,"a"]-->v2 #2.copy
v1=[1,2,3]
import copy
v3=copy.copy(v1)
print(v3 is v1)#False
v1.append("abc")#对v1指向的地址进行内部修改
print(v1,v3)
#[1,2,3,"abc"]-->v1
#[1,2,3] --->v3 #3.copy
import copy
v1 = [1,2,3,{"name":'Gao',"numbers":[7,77,88]},4,5]
v2 = copy.copy(v1) print(v1 is v2)#False print(v1[0] is v2[0])#True
print(v1[3] is v2[3])#True print(v1[3]['name'] is v2[3]['name'])#True
print(v1[3]['numbers'] is v2[3]['numbers'])#True
print(v1[3]['numbers'][1] is v2[3]['numbers'][1])#True #3.deepcopy
v1=[1,2,3]
import copy
v4=copy.deepcopy(v1)
print(v4 is v1)#False
v1.append("aaa")
print(v1,v4)
#[1,2,3,"aaa"]
#[1,2,3](有嵌套)列表,集合,字典的拷贝
v1=[1,2,3,["a","b"]]
import copy #1.浅拷贝
v3=copy.copy(v1)
print(v3 is v1)#不等
v1.append("GG")#v1添加
print(v1,v3)
#[1, 2, 3, ['a', 'b'],'GG'] --->v1
#[1, 2, 3, ['a', 'b']] --->v3
#v1的第一层列表改变后,v3没有改变 v1[3].append("c")
print(v1,v3)
#[1, 2, 3, ['a', 'b', 'c'], 'GG'] --->v1
# [1, 2, 3, ['a', 'b', 'c']]
#v1的第二层列表(子对象改变后) v3也跟着改变
print(v1[3] is v3[3]) #True
===>v1[3] 和v3[3]指向同一个内存地址
===>浅拷贝只会拷贝到父对象 不会拷贝到子对象 #2.深拷贝 v1=[1,2,3,["a","b"]]
import copy
v4=copy.deepcopy(v1)
print(v4 is v1)#False
v1.append("Gao")#v1改变
print(v4)
#[1, 2, 3, ['a', 'b']] 没改变
v1[3].append("c")
print(v4)
#[1, 2, 3, ['a', 'b']] 没改变
print(v1[3] is v4[3])#False
====>深拷贝会拷贝到所有嵌套的子对象 #3.
import copy
v1 = [1,2,3,{"name":'gao',"numbers":[7,77,88]},4,5]
v2 = copy.deepcopy(v1) print(v1 is v2)#False
print(v1[0] is v2[0])#True
print(v1[3] is v2[3])#False
print(v1[3]['name'] is v2[3]['name'])#True
print(v1[3]['numbers'] is v2[3]['numbers'])#False
print(v1[3]['numbers'][1] is v2[3]['numbers'][1])#True
特殊: tuple是不可变类型,但是嵌套的元组深拷贝也会有效
v1=(1,2,3,4)
v2=copy.copy(v1)
print(id(v1),id(v2))#一样 v2=copy.deepcopy(v1)
print(id(v1),id(v2))#一样 v1=(1,2,3,4,[1,2,3])
v2=copy.copy(v1)
print(id(v1),id(v2))#一样 v2=copy.deepcopy(v1)
print(id(v1),id(v2))#不一样练习
v1=[1,2,3]
v2=copu.copy(v1)
print(v1 ==v2)#一样
print(v1 is v2)#不同
print(v1[0] is v2[0])#一样 v1=[1,2,3,{'k1':'1':'k2':'2'}]
v2=copy.deepcopy(v1)
print(v1 == v2)#一样
print(v1 is v2)#不同
print(v1[0] is v2[0])#一样
print(v1[3] is v2[3])#不同
文件操作(open/read/write/close)
- 关闭
总结
深浅拷贝
不可变类型
- 深浅拷贝后,内存地址本该不等 ,但是由于 (小数据缓存机制原因), , (内存地址和value值都相等),(元组tuple的深拷贝除外)
可变类型
浅拷贝(copy):只会拷贝第一层父对象,嵌套的子对象不会被拷贝,即就是如果嵌套的是(列表/集合/字典)只会拷贝到此类对象的引用地址,而不会深入拷贝地址中的存储值
深拷贝(deepcopy):会拷贝到所有嵌套的子对象,(拷贝到不可变类型为止)
所以拷贝的和被拷贝对象中的可变类型的内存地址都不相等
特殊:tuple
- 浅拷贝:内存地址不变
- 深拷贝:会按照深拷贝原理
文件操作
- 打开文件 :open("文件路径","mode=r/w/a",encoding="utf-8")
- 打开模式 mode
- r
- w:打开文件之前会清空
- a
- r+
- w+
- a+
- seek(2):光标位置向后移动两个字节
- 读写追加都会根据不同的打开文件模式来自动改变光标位置
- 打开模式 mode
- 操作
- 读
- read()
- readline()
- readlines()
- 写:write
- 关闭:close()
- 读
- 练习
- 去换行 strip()
- 打开文件 :open("文件路径","mode=r/w/a",encoding="utf-8")
day07 深浅拷贝的更多相关文章
- day07 python列表 集合 深浅拷贝
day07 python 一.知识点补充 1."".join() s = "".join(('1','2','3','4','5')) #将字符串 ...
- python学习打卡 day07 set集合,深浅拷贝以及部分知识点补充
本节的主要内容: 基础数据类型补充 set集合 深浅拷贝 主要内容: 一.基础数据类型补充 字符串: li = ["李嘉诚", "麻花藤", "⻩海峰 ...
- Python 从零学起(纯基础) 笔记 之 深浅拷贝
深浅拷贝 1. import copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2. 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- Python-Day3知识点——深浅拷贝、函数基本定义、内置函数
一.深浅拷贝 import copy #浅拷贝 n1={'k1':'wu','k2':123,'k3':['carl',852]} n2=n1 n3=copy.copy(n1) print(id(n1 ...
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
- python 学习笔记5(深浅拷贝与集合)
拷贝 我们已经详细了解了变量赋值的过程.对于复杂的数据结构来说,赋值就等于完全共享了资源,一个值的改变会完全被另一个值共享. 然而有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这个 ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
随机推荐
- 类自动调用to.string方法
所有对象都有toString()这个方法,因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法” 它通常只是为了方便输出,比如System.out.prin ...
- css的再深入8(更新中···)
1.去滚动条的属性 overflow:hidden; overflow-x:hidden; 水平超出的隐藏. 2.z-index 层次叠加 元素重叠 谁的值大谁在上面 (1) 父级出现position ...
- CPU高速缓存
目录 Code: 物理结构: 缓存行Cache Line 伪共享: 概念: 解决办法: 内存屏障: 理解: 参考: Code: public class Main { static long[][] ...
- vi删除当前行的字符
x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行
- Python:将数组中的元素导出到变量中 (unpacking)
问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构 ...
- IP分为五类
IP地址分为五类: IP地址分为五类:A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验. 常用的三类IP地址 IP = 网路地址(网络号)+主机地址(主 ...
- _mount_allowed
该表配置可以坐骑的使用区域,可能需要修改spell.dbc,允许在室内等特殊区域使用坐骑技能
- POJ 3278 抓奶牛(BFS入门题)
描述 农夫约翰已被告知逃亡牛的位置,并希望立即抓住她.他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000).农夫约翰有两种交通方式:步行和传送. ...
- js 字符串跟数组的相互转化
一:字符串转化为数组 例子: var str = "3:2;2:1"; 要变成 arr= [{ a:"3", b:"2", bol:fals ...
- java去除表达符号的正则表达式
java 去标点符号正则表达式 博客分类: 小功能 正则表达式标点符号 public static void main(String[] args) {String s = "哈哈!@#W ...