首页 > 编程语言 > 详细

Python基础

时间:2020-04-30 13:58:40      阅读:43      评论:0      收藏:0      [点我收藏+]

1.数据类型:

# 可变:

list ,dict ,set(集合)

# 不可变:

int bool str tuple

# 有序: list,tuple,str,int,bool # 无序: dict(python3.6以后可以是有序的了),set


# 取值方式: # 索引: str list tuple # 直接: set ,int ,bool # 键: dict

 

注意:‘is‘和‘==‘

  ‘==‘只比较值是否一样

  ‘is‘不仅比较值一样还要比较内存地址是否一样

2.深浅拷贝:

import copy

lst1=[1,2,3]

lst2=copy.copy(lst1)#浅拷贝

lst3=copy.deepcopy(lst1)#深拷贝

lst4=lst1 #赋值

 

定义:

浅拷贝 :

浅拷贝只拷贝第一层(如果有列表嵌套,他会复制那一个索引位置的列表的内存地址,而那个列表内的数据不会复制,说白了就是共用内部的list,最外层的list是自己新建的)

 

深拷贝:

可变类型拷贝,不可变类型共用(列表嵌套时,内层的列表地址不会复制,因为list是可变的,他是自己创个内部的list,然后共用list内的不可变元素的地址)

其实深拷贝不可变元素时也应该重新创建内存,来访对应的不可变元素,因为小数据池的关系所以就没新开辟地址.

 

注:

  如果发生了拷贝,内存地址一定发生变化,说白了拷贝就是自己新建地址,放复制过来的内容.

 

如下图:深浅拷贝如果只拷贝一个单一的列表(列表内不包含字典列表等可变元素)的情况下,深浅拷贝效果都一样:

技术分享图片

 再看代码:

#如果只是单一列表,深浅拷贝都一样
import copy

lst1=[1,2,3]

lst2=copy.copy(lst1)#浅拷贝

lst3=copy.deepcopy(lst1)#深拷贝

print(id(lst1),id(lst2),id(lst3))#列表地址新建,全都不一样
# 44954968 44957408 44990712
print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#内部不可变元素全都共用
# 496100128 496100128 496100128

 

 

 

 重点(这里要着重理解):

列表内部加了列表后(深浅拷贝就不一样了):

技术分享图片

 

看代码:

#如果列表套列表,深浅拷贝大不一样了
import copy

lst1=[1,2,3,[4,5,6,[7,8,9]]]

lst2=copy.copy(lst1)#浅拷贝

lst3=copy.deepcopy(lst1)#深拷贝

print(id(lst1),id(lst2),id(lst3))#地址新建,全都不一样
# 44954968 44957408 44990712
print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#内部不可变元素全都共用
# 496100128 496100128 496100128

# 看内部列表
print(id(lst1[3]) , id(lst2[3]) , id(lst3[3]))#深拷贝是自己建的所以不一样,浅拷贝是共用的
# 52295000 52295000 52330984

# 看内部列表的内部元素
print(id(lst1[3][0]) , id(lst2[3][0]) , id(lst3[3][0]))#4是不可变元素,共用
# 496296768 496296768 496296768

# 看内部列表再套的列表
print(id(lst1[3][3]) , id(lst2[3][3]) , id(lst3[3][3]))#还是只有深拷贝自己建(因为列表不管在哪都是可变元素),浅拷贝共用
# 44758360 44758360 44796584

print(id(lst1[3][3][1]) , id(lst2[3][3][1]) , id(lst3[3][3][1]))#里面的不可变元素8还是共用的
# 493675392 493675392 493675392

 

 

特殊情况(元组套列表):

如果单一元组深浅拷贝就都一样:

import copy

v1=(1,2,3)

v2=copy.copy(v1)#浅拷贝

v3=copy.deepcopy(v1)#深拷贝

print(id(v1[1]),id(v2[1]),id(v3[1]))#内部不可变元素都是一样的
# 501474080 501474080 501474080

print(id(v1),id(v2),id(v3))#浅拷贝只是单一元组,深浅拷贝都一样,因为里面都是不可变元素,元组也不可变
# 47061912 47061912 47061912
copy.copy(v)=copy.deepcopy(v)
#单一元组时深浅拷贝都一样

 

如果元组里有列表:

import copy

v1=(1,2,3,[4,5,6])

v2=copy.copy(v1)#浅拷贝

v3=copy.deepcopy(v1)#深拷贝

print(id(v1),id(v2),id(v3))#浅拷贝不变,深拷贝会变,因为里面多了不可变元素,深拷贝要变的
# 18215728 18215728 48191024
print(id(v1[1]),id(v2[1]),id(v3[1]))#内部不可变元素都是一样的
# 501474080 501474080 501474080

print(id(v1[3]),id(v2[3]),id(v3[3]))#内部列表已经不同地址了所以元组也变了
# 51377496 51377496 51413360
元组套列表(元组里面都是不可变元素,都不变,怎么拷贝都一样,如果元组里面有可变元素,例如列表,此时深拷贝会变,浅拷贝没事,和原来一样) 浅拷贝不变 深拷贝变了,因为深拷贝中不可变元素不会共用

 

Python基础

原文:https://www.cnblogs.com/shengjunqiye/p/12808211.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!