一、数字int
数字主要是用于计算、运算。使用方法并不是很多,就记住一种就可以:
1 ''' 2 bit_length()将十进制转化为二进制站的位数 3 二进制 十进制 4 0000 0001 1 5 0000 0010 2 6 0000 0011 3 7 0000 0100 4 8 ''' 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 ---> True 7 bool---> int :int(True)---> 1 int(False)---> 0 8 str ---> bool:空字符串 ---> False 非空字符串---> True 9 ''' 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() 去除首位的空格,制表符 ,换行符 。不仅仅是去除空格
注:lstrip() 只除字符串左边的;rstrip() 只除字符串右边的;
1 s=' Hello World! ' 2 ss=' Hello World! ' 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 del l1 16 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 in li: 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]
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 del dic 14 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 in dic.keys(): 22 print(i) 23 for i in dic.values(): 24 print(i) 25 for i in dic.items(): 26 print(i) 27 for k,v in dic.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,a 33 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'}) <class 'frozenset'> 4 print(s1,type(s1))#>>>frozenset({4, 5, 6, 7, 8}) <class 'frozenset'>
八、数据类型的补充
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 del l1[i] 22 print(l1)#>>>['Lily', 'Lucas'] 23 24 #dic{} 在循环字典时,不要对字典的进行删除和增加 25 dic={'k1':'v1','k2':'v2','k3':'v3','a1':'b1'} 26 l1=[] 27 for i in dic: 28 if 'k' in i: 29 l1.append(i) 30 for i in l1: 31 del dic[i] 32 print(dic)#>>>{'a1': 'b1'} 33 34 #tu元组 如果元组里面只有一个元素并且没有逗号隔开,name他的数据类型与该元素一致 35 tu1=(1) 36 print(tu1,type(tu1))#>>>1 <class 'int'> 37 tu2=('Lucy') 38 print(tu2,type(tu2))#>>>Lucy <class 'str'> 39 tu3=(['alex',1,2]) 40 print(tu3,type(tu3))#>>>['alex', 1, 2] <class 'list'>
九、深浅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来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。