一、数字int
数字主要是用于计算、运算。使用方法并不是很多,就记住一种就可以:
1 '''
2 bit_length()将十进制转化为二进制站的位数3 二进制 十进制4 0000 0001 15 0000 0010 26 0000 0011 37 0000 0100 48 '''
9 i=3
10 j=4
11 print(i.bit_length())#>>>2
12 print(j.bit_length())#>>>3
二、布尔值bool
布尔值就两种:True,False。就是反应条件的正确与否。
1 '''
2 数字与字符串转化3 int ---> str : str(int)4 str ---> int : int(str) str必须全部是数字组成5 布尔型与数字、字符串转化6 int ---> bool:0 ---> False 非0 ---> True7 bool---> int :int(True)---> 1 int(False)---> 08 str ---> bool:空字符串 ---> False 非空字符串---> True9 '''
10 print(int(True))#>>>1
11 print(int(False))#>>>0
12 print(bool(''))#>>>False
13 print(bool('a'))#>>>False
三、字符串
1、字符串的索引
索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推。
1 s='Hello World!'
2 s1=s[0]#第一个元素
3 s2=s[-1]#最后一个元素
4 s3=s[-2]#倒数第二个元素
5 print(s1)#>>>H
6 print(s2)#>>>!
7 print(s3)#>>>d
2、字符串的切片
切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾首不顾尾)。
s1=s[起始索引:结束索引:步长]
1 s='Hello World!'
2 s1=s[0:3]#从字符串的第1个字符到第3个字符进行切片
3 s2=s[:3]#0可以省略
4 s3=s[3:9]#从字符串的第4个字符到第9个字符进行切片
5 s4=s[:5:2]#从字符串的第1个字符到第5个字符进行切片,加步长2
6 s5=s[:]#把字符串全部取出来
7 s6=s[-1:-4:-1]#反向取字符串,加反向步长
8 print(s1)#>>>Hel
9 print(s2)#>>>Hel
10 print(s3)#>>>lo Wor
11 print(s4)#>>>Hlo
12 print(s5)#>>>Hello World!
13 print(s6)#>>>!dl
3、字符串常用的方法
1)* captalize() 首字母大写
1 s='Hello World!'
2 s1=s.capitalize()3 print(s1)#>>>Hello world!
2)***upper() 字母全部大写 lower() 字母全部小写
1 s='Hello World!'
2 s2=s.upper()3 s3=s.lower()4 print(s2)#>>>HELLO WORLD!
5 print(s3)#>>>hello world!
1 #例 验证码不区分大小写
2 code = 'QcaR'.upper()3 your_code =input('请输入验证码:').upper()4 if your_code ==code :5 print('验证成功')
3)swapcase() 大小写翻转
1 s='Hello World!'
2 s1=s.swapcase()3 print(s1)#>>>hELLO wORLD!
4)title() 非字母的元素隔开的每个单词首字母大写
1 msg='hello world_hello*world'
2 print(msg.title())#>>>Hello World_Hello*World
5)center() 内容居中,总长度自己设定,默认填充None
1 s='Hello World!'
2 s1=s.center(20,"*")3 s2=s.center(20,)4 print(s1)#>>>****Hello World!****
5 print(s2)#>>> Hello World!
6)*** strartwith() 判断以什么为开头 *** endswith() 判断以什么为结尾
1 s='Hello World!'
2 s1=s.startswith('H')3 print(s1)#>>>True
4 s2=s.startswith('He')5 print(s2)#>>>True
6 s3=s.startswith('e',1,5)#切片截取的字符串是否以‘e’为开头
7 print(s3)#>>>True
8 s4=s.endswith('!')9 print(s4)#>>>True
7)strip() 去除首位的空格,制表符\t,换行符\n。不仅仅是去除空格
注:lstrip() 只除字符串左边的;rstrip() 只除字符串右边的;
1 s='Hello World!'
2 ss='\tHello World!\n'
3 s1=s.strip()4 print(s1)#>>>Hello World!
5 s2=ss.strip()6 print(s2)#>>>Hello World!
7 sss='tHello World!te'
8 s3=sss.strip('t')#去掉字符串首尾的‘t’
9 print(s3)#>>>Hello World!te
10 s4=sss.strip('tey')#跌带去除首尾的‘t’、‘e’、‘y’,无序
11 print(s4)#>>>Hello World!
1 #例 去除用户输入的空格
2 name = input('>>>').strip()3 if name == 'oldboy':4 print('验证成功')
8)#split() 字符串 转化 列表
1 s='Hello World!'
2 s1=s.split()3 print(s1)#>>>['Hello', 'World!']
4 ss='He,llo Wo,rld!'
5 s2=ss.split(',')6 print(s2)#>>>['He', 'llo Wo', 'rld!']
7 sss='oHello World!'
8 s3=sss.split('o')9 print(s3)#>>>['', 'Hell', ' W', 'rld!']
10 s4=sss.split('o',1)11 print(s4)#>>>['', 'Hello World!']
9)join() 将列表 转化 字符串
注:如果列表里是非字符串元素,会报错
s='Hello World!'s1='+'.join(s)print(s1)#>>>H+e+l+l+o+ +W+o+r+l+d+!
s2='_'.join(s)print(s2)#>>>H_e_l_l_o_ _W_o_r_l_d_!
ss=['Hello','World','!']
s3='_'.join(ss)print(s3)#>>>Hello_World_!
10)replace() 把字符串的旧字符串替换成新的字符串,如果指定第三个参数max,则替换不超过max次。
语法:str.replace(old,new[,max])
1 s='Hello World!'
2 s1=s.replace('W','w')3 print(s1)#>>>Hello world!
11)find() 通过元素找索引 index() 通过元素找索引 找不到元素会报错
1 s='Hello World!'
2 s1=s.find("e",1,6)3 print(s1)#>>>1
4 s2=s.find("m",1,6)5 print(s2)#>>>-1
6 s2=s.index("o",1,6)7 print(s2)#>>>4
12)formac() 格式化输出
1 s1='我叫{},今年{}岁,爱好{}'.format('Lucy','18','羽毛球')2 print(s1)#>>>我叫Lucy,今年18岁,爱好羽毛球
3 s2='我叫{0},今年{1}岁,爱好{2}'.format('Lucy','18','羽毛球')#可以按照索引进行替换
4 print(s2)#>>>我叫Lucy,今年18岁,爱好羽毛球
13)is系列
1 s='a123'
2 print(s.isdigit())#字符串由数字组成
3 print(s.isalpha())#字符串由字母组成
4 print(s.isalnum())#字符串由字母或数字组成
14)公共方法 :len() 返回对象的长度或项目个数; count() 数字字符串的元素出现的个数
1 s='hello world'
2 s1=len(s)3 print(s1)#>>>11
4 s2=s.count("l",0,10)5 print(s2)#>>>3
四、列表
列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组。列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,32位python的限制是 536870912 个元素,64位python的限制是 1152921504606846975 个元素。而且列表是有序的,有索引值,可切片,方便取值。
1、增
1 #append() 在最后追加元素,无返回值
2 l1=[111,'aaa',222,'bbb']3 l1.append('123abc')4 print(l1)#>>>[111, 'aaa', 222, 'bbb', '123abc']
5 #insert() 插入
6 l2=[111,'aaa',222,'bbb']7 l2.insert(1,'ccc')8 print(l2)#>>>[111, 'ccc', 'aaa', 222, 'bbb']
9 #extend 迭代着增加
10 l3=[111,'aaa',222,'bbb']11 l3.extend('ddd')12 print(l3)#>>>[111, 'aaa', 222, 'bbb', 'd', 'd', 'd']
13 l4=[111,'aaa',222,'bbb']14 l4.extend(['333','444'])15 print(l4)#>>>[111, 'aaa', 222, 'bbb', '333', '444']
列表的增
2、删
1 #pop 按照索引删除,有返回值,增删改查中唯一一个有返回值的
2 l1=[111,'aaa',222,'bbb']3 print(l1.pop(0))#>>>111
4 print(l1)#>>>['aaa', 222, 'bbb']
5 #remove
6 l1=[111,'aaa',222,'bbb']7 l1.remove('aaa')8 print(l1)#>>>[111, 222, 'bbb']
9 #clear 清空列表,删除内容,但是在内存中还占用空间
10 l1=[111,'aaa',222,'bbb']11 l1.clear()12 print(l1)#>>>[]
13 #del 内存级别删除列表
14 l1=[111,'aaa',222,'bbb']15 dell116 print(l1)#报错,内存中删除列表
17 #del 按照元素删除
18 l1=[111,'aaa',222,'bbb']19 del l1[1]20 print(l1)#>>>[111, 222, 'bbb']
21 #del 切片删除
22 l1=[111,'aaa',222,'bbb']23 del l1[:3]24 print(l1)#>>>['bbb']
列表的删
3、改
1 #按照索引去改
2 l1=[111,'aaa',222,'bbb']3 l1[2]='ccc'
4 print(l1)#>>>[111, 'aaa', 'ccc', 'bbb']
5 #按切片去改 1.按切片的元素删除;2.按照添加的组成最小元素添加
6 l1=[111,'aaa',222,'bbb']7 l1[:2]='abc'
8 print(l1)#>>>['a', 'b', 'c', 222, 'bbb']
列表的改
4、查
1 li=[111,'aaa',222,'bbb']2 #按照索引去查
3 print(li[1])#>>>aaa
4 print(li[-1])#>>>bbb
5 #按照切片查询
6 print(li[:2])#>>>[111, 'aaa']
7 print(li[:3:2])#>>>[111, 222]
8 #循环for
9 for i inli:10 print(i)
列表的查
5、其他方法
1 #count 计数
2 l1=[111,'aaa',222,'bbb','aaa']3 print(l1.count('aaa'))#>>>2
4 #len 返回对象的长度
5 print(len(l1))#>>>5
6 #通过元素找索引 列表中只有index
7 print(l1.index('aaa'))#>>>1
8 #排序
9 #sort() 从小到大或从大到小排序
10 l1=[3,6,4,7,6,9,1,2,5,0]11 l1.sort()#从小到大排序
12 print(l1)#>>>[0, 1, 2, 3, 4, 5, 6, 6, 7, 9]
13 l1.sort(reverse=True)#从大到小排序
14 print(l1)#>>>[9, 7, 6, 6, 5, 4, 3, 2, 1, 0]
15 #reverse 反向排序
16 l1=[3,6,4,7,6,9,1,2,5,0]17 l1.reverse()18 print(l1)#>>>[0, 5, 2, 1, 9, 6, 7, 4, 6, 3]
count() len() sort() reverse()
6、列表的嵌套
1 l1=[111,'aaa',222,'bbb',['ccc','ddd',10]]2 #1.将aaa全部变成大写
3 #方法一
4 l1[1]='AAA'
5 print(l1)#>>>[111, 'AAA', 222, 'bbb', ['ccc', 'ddd',10]]
6 #方法二
7 l1[1]=l1[1].upper()8 print(l1)#>>>[111, 'AAA', 222, 'bbb', ['ccc', 'ddd',10]]
9 #2.给['ccc','ddd']追加'eee'
10 l1[-1].append('eee')11 print(l1)#>>>[111, 'aaa', 222, 'bbb', ['ccc', 'ddd',10, 'eee']]
12 #3.将'ccc'首字母大写
13 l1[-1][0]=l1[-1][0].capitalize()14 print(l1)#>>>[111, 'aaa', 222, 'bbb', ['Ccc', 'ddd',10]]
15 #4.将10通过数字相加,或者字符串相加等等,变成‘100’
16 #方法一
17 l1[-1][-1]=str(l1[-1][-1]+90)18 print(l1)#>>>[111, 'aaa', 222, 'bbb', ['ccc', 'ddd', '100']]
19 #方法二
20 l1[-1][-1]=str(l1[-1][-1])+'0'
21 print(l1)#>>>[111, 'aaa', 222, 'bbb', ['ccc', 'ddd', '100']]
列表的嵌套
五、字典
字典的key是唯一的。key必须是不可变的数据类型,value是任意数据类型。
数据类型分类:
不可变数据类型(可哈希):str,bool,tuple,int。
可变数据类型(不可哈希):dict,list,set。
容器类数据类型:list,tuple,dict,set。
字典:存储数据多,关系型数据,查询速度快(二分查找)
二分查找:也称折半查找(Binary Search),它是一种高效率的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中的元素按关键字有序排列。
备注:python3.5以前 (包含3.5),字典无序
python3.6以后 (包含3.6),进行了优化,不清楚到底是有序还是无序
1 dic={'name':'lucy','age':'18',[1,2,3]}2 print(dic)#输出时会报错,因为列表是不可哈希类型
1、增
1 #'='有则覆盖,无则添加
2 dic={'name':'lucy','age':'18','hobby':'羽毛球'}3 dic['high']=170#有则不变,无则添加
4 print(dic)#>>>{'name': 'lucy', 'age': '18', 'hobby': '羽毛球', 'high': 170}
5 #setdefault() 有则不变,无则添加
6 dic={'name':'lucy','age':'18','hobby':'羽毛球'}7 dic.setdefault('high')8 print(dic)#>>>{'name': 'lucy', 'age': '18', 'hobby': '羽毛球', 'high': None}
9 dic={'name':'lucy','age':'18','hobby':'羽毛球'}10 dic.setdefault('high',170)11 print(dic)#>>>{'name': 'lucy', 'age': '18', 'hobby': '羽毛球', 'high': 170}
12 dic.setdefault('name','lily')#>>>{'name': 'lucy', 'age': '18', 'hobby': '羽毛球', 'high': 170}
13 print(dic)
列表的增
2、删
1 #pop() pop根据key删除键值对,并返回对应的值,如果没有key则返回默认返回值
2 dic={'name':'lucy','age':'18','hobby':'羽毛球'}3 print(dic.pop('name'))#>>>lucy
4 print(dic)#>>>{'age': '18', 'hobby': '羽毛球'}
5 #pop() 删除不存在的键不会报错,返回对应的值
6 dic={'name':'lucy','age':'18','hobby':'羽毛球'}7 print(dic.pop('name1',None))#>>>None None位置可以输入任意值
8 print(dic)#>>>{'name': 'lucy', 'age': '18', 'hobby': '羽毛球'}
9 #clear() 清空字典
10 dic.clear()11 print(dic)#>>>{}
12 #del() 内存级别删除
13 deldic14 print(dic)#打印时会报错,因为在内存级别已经删除
15 dic={'name':'lucy','age':'18','hobby':'羽毛球'}16 del dic['age']17 print(dic)#>>>{'name': 'lucy', 'hobby': '羽毛球'}
18 #popitem()随机删除字典中的某个键值对,将删除的键值对以元祖的形式返回,在python3.6以后,默认删除最后一个键值对
19 dic={'name':'lucy','age':'18','hobby':'羽毛球'}20 print( dic.popitem())#>>>('hobby', '羽毛球')
21 print(dic)#>>>{'name': 'lucy', 'age': '18'}
列表的删
3、改
1 #'='
2 dic={'name':'lucy','age':'18','hobby':'羽毛球'}3 dic['name']='Lily'
4 print(dic)#>>>{'name': 'Lily', 'age': '18', 'hobby': '羽毛球'}
5 #update() 将dic1覆盖添加dic2中 ,dic1不变
6 dic1={'name':'lucy','age':'18','hobby':'羽毛球'}7 dic2={'name':'Lily','high':170}8 dic2.update(dic1)9 print(dic2)#>>>{'name': 'lucy', 'high': 170, 'age': '18', 'hobby': '羽毛球'}
列表的改
4、查
1 #直接按照键查找
2 dic={'name':'lucy','age':'18','hobby':'羽毛球'}3 print(dic['name'])#>>>lucy
4 #get() 查不到不会报错,返回None
5 print(dic.get('name1'))#>>>None
6 print(dic.get('name1','没有此key'))#>>>没有此key
7
8 #keys() values() items()
9 dic={'name':'lucy','age':'18','hobby':'羽毛球'}10 #keys()
11 print(dic.keys())#>>>dict_keys(['name', 'age', 'hobby'])
12 print(list(dic.keys()))#>>>['name', 'age', 'hobby']
13 #values()
14 print(dic.values())#>>>dict_values(['lucy', '18', '羽毛球'])
15 print(list(dic.values()))#>>>['lucy', '18', '羽毛球']
16 #items()
17 print(dic.items())#>>>dict_items([('name', 'lucy'), ('age', '18'), ('hobby', '羽毛球')])
18 print(list(dic.items()))#>>>[('name', 'lucy'), ('age', '18'), ('hobby', '羽毛球')]
19 #for循环取值
20 dic={'name':'lucy','age':'18','hobby':'羽毛球'}21 for i indic.keys():22 print(i)23 for i indic.values():24 print(i)25 for i indic.items():26 print(i)27 for k,v indic.items():28 print(k,v)29 #分别赋值
30 a,b=1,2
31 print('a=',a,'b=',b)#>>>a= 1 b= 2
32 a,b=b,a33 print('a=',a,'b=',b)#>>>a= 2 b= 1
34 a,b,c=['Lily','Lucy','Lucas']35 print('a=',a,'b=',b,'c=',c)#>>>a= Lily b= Lucy c= Lucas
列表的查
5、公共方法 len()
1 dic={'name':'lucy','age':'18','hobby':'羽毛球'}2 print(len(dic))#>>>3
6、fromkeys() 创建字典一种,以fromkeys()创建的键值对,如果值是列表的话,多个共用的都是一个列表
1 dic={}2 dic1=dic.fromkeys('abc','张三')3 print(dic1)#>>>{'a': '张三', 'b': '张三', 'c': '张三'}
4 dic2=dic.fromkeys([1,2,3],'李四')5 print(dic2)#>>>{1: '李四', 2: '李四', 3: '李四'}
6 dic3=dic.fromkeys('abc',[])7 dic3['a'].append('张三')8 print(dic3)#>>>{'a': ['张三'], 'b': ['张三'], 'c': ['张三']}
7、字典的嵌套
1 dic ={2 'name_list':['b哥', '张帝', '人帅', 'kitty'],3 '老男孩':{4 'name':'老男孩',5 'age': 46,6 'sex': 'ladyboy',7 }8 }9 #1、['b哥', '张帝', '人帅', 'kitty']追加一个骑兵
10 dic['name_list'].append('骑兵')11 print(dic)12 #2、将kitty全部变成大写
13 dic['name_list'][-1]=dic['name_list'][-1].upper()14 print(dic)15 #3、将'name':'老男孩',老男孩改成oldboy
16 dic['老男孩']['name']='oldboy'
17 print(dic)18 #4、将ladyboy首字母大写
19 dic['老男孩']['sex']=dic['老男孩']['sex'].capitalize()20 print(dic)
六、元组
python的元组与列表类型,不同之处在于元组的元素不能修改(增删改)。
元组使用小括号(),列表使用方括号[]。
元组创建很简单,只需要在括号里添加元素,并使用逗号隔开即可。
1 tu=(11,2,True,[2,3,4],'alex')2 #循环查询
3 #for i in tu:
4 #print(i)
5 #切片查询
6 print(tu[1])#>>>2
7 print(tu[:3:2])#>>>(11, True)
8 #index() 通过元素找索引 count() 元素出现的个数 len() 元素的个数
9 print(tu.index(True))#>>>2
10 print(tu.count(2))#>>>1
11 print(len(tu))#>>>5
12 #元素里面的元素可以修改
13 tu[-2].append('a')14 print(tu)#(11, 2, True, [2, 3, 4, 'a'], 'alex')
元组的查
七、集合
集合:无序不重复的数据类型。它里面的元素必须是可哈希的,但是集合本身是不可哈希的。
1、关系测试,交集,并集,子集,差集
2、去重(列表的去重)
1 set1={1,'alex',False,(1,2,3)}2 l1=[1,1,2,2,3,3,4,5,6,6]3 l2=(list(set(l1)))4 print(l2)#>>>[1, 2, 3, 4, 5, 6]
1、增删改查
1#集合的增无序2set1={'Lily','Lucy'}3set1.add('Lucas')4print(set1)#>>>{'Lucas','Lily','Lucy'}5#跌带着增加update()6set1={'Lily','Lucy'}7set1.update('Lucas')8print(set1)#>>>{'a','Lily','u','c','L','s','Lucy'}9#集合的删10#remove()按照元素删除11set1={'Lily','Lucy'}12set1.remove('Lucy')13print(set1)#>>>{'Lily'}14#pop()随机删除一个元素15set1={'Lily','Lucy'}16set1.pop()17print(set1)#>>>{'Lucy'}18#clear()清空集合19set1={'Lily','Lucy'}20set1.clear()21print(set1)#>>>set()22#del()内存级别删除集合23set1={'Lily','Lucy'}24delset125print(set1)#报错
集合的增删改查
2、集合其他操作
1)交集
1 set1={1,2,3,4,5}2 set2={4,5,6,7,8}3 print(set1 & set2 )#>>>{4, 5}
4 print(set1.intersection(set2))#>>>{4, 5}
2)并集
1 set1={1,2,3,4,5}2 set2={4,5,6,7,8}3 print(set1 | set2)#>>>{1, 2, 3, 4, 5, 6, 7, 8}
4 print(set1.union(set2))#>>>{1, 2, 3, 4, 5, 6, 7, 8}
3)差集
1 set1={1,2,3,4,5}2 set2={4,5,6,7,8}3 print(set1 - set2)#>>>{1, 2, 3}
4 print(set1.difference(set2))#>>>{1, 2, 3}
4)反交集
1 set1={1,2,3,4,5}2 set2={4,5,6,7,8}3 print(set1 ^ set2 )#>>>{1, 2, 3, 6, 7, 8}
4 print(set1.symmetric_difference(set2))#>>>{1, 2, 3, 6, 7, 8}
5)子集
1 set1={1,2,3}2 set2={1,2,3,4,5,6}3 print(set1 < set2)#>>>True
4 print(set1.issubset(set2))#>>>True
6)超集
1 set1={1,2,3}2 set2={1,2,3,4,5,6}3 print(set2 > set1)#>>>True
4 print(set2.issuperset(set1))#>>>True
7)frozenset不可变集合,让集合变成不可变类型
1 s=frozenset('abc')2 s1=frozenset({4,5,6,7,8})3 print(s,type(s))#>>>frozenset({'c', 'b', 'a'})
4 print(s1,type(s1))#>>>frozenset({4, 5, 6, 7, 8})
八、数据类型的补充
1 #range 可定制的数字列表 顾头不顾尾 一般与for()循环一起使用
2 for i in range(10):3 print(i)#输出1到9
4 #加步长
5 for i in range(1,10,2):6 print(i)#输出1,3,5,7,9
7 for i in range(10,1,-1):8 print(i)#输出10到2
9 print(range(10))#>>>range(0, 10)
10
11 #切片删除
12 l1=['Lily','Lucy','Lucas','Amy']13 del l1[1::2]14 print(l1)#>>>['Lily', 'Lucas']
15
16 #循环删除 在循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错
17 #从后往前删除
18 l1=['Lily','Lucy','Lucas','Amy']19 for i in range(len(l1)-1,-1,-1):20 if i % 2 == 1:21 dell1[i]22 print(l1)#>>>['Lily', 'Lucas']
23
24 #dic{} 在循环字典时,不要对字典的进行删除和增加
25 dic={'k1':'v1','k2':'v2','k3':'v3','a1':'b1'}26 l1=[]27 for i indic:28 if 'k' ini:29 l1.append(i)30 for i inl1:31 deldic[i]32 print(dic)#>>>{'a1': 'b1'}
33
34 #tu元组 如果元组里面只有一个元素并且没有逗号隔开,name他的数据类型与该元素一致
35 tu1=(1)36 print(tu1,type(tu1))#>>>1
37 tu2=('Lucy')38 print(tu2,type(tu2))#>>>Lucy
39 tu3=(['alex',1,2])40 print(tu3,type(tu3))#>>>['alex', 1, 2]
九、深浅copy
1,先看赋值运算。
l1 = [1,2,3,['barry','alex']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['barry', 'alex']]
print(l2) # [111, 2, 3, ['barry', 'alex']]
l1[3][0] = 'wusir'
print(l1) # [111, 2, 3, ['wusir', 'alex']]
print(l2) # [111, 2, 3, ['wusir', 'alex']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
2,浅拷贝copy。
l1 = [1,2,3,['barry','alex']]
l2 = l1.copy()
print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2380296895816
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2380296895048
l1[1] = 222
print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2593038941128
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2593038941896
l1[3][0] = 'wusir'
print(l1,id(l1[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016
print(l2,id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
3,深拷贝deepcopy。
import copy
l1 = [1,2,3,['barry','alex']]
l2 = copy.deepcopy(l1)
print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048
l1[1] = 222
print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048
l1[3][0] = 'wusir'
print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2915377167240
print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2915377167304
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。