首页 > 代码库 > python基础3
python基础3
一、pyc文件
1、前提
编写auth.py模块,新建test.py文件引用auth.py文件--运行test.py文件之后会生成auth.pyc文件
不同版本的区别
python2:生成的__pycache__ 文件夹、ahtu.pyc文件
python3:生成的pyc文件,名称修改为:auth.cpython-35.pyc,并且是直接在__pycache__ 文件夹里面的
2、python是一门解释型语言?
我初学python时,听到的关于python的第一句话就是,python是一门解释型语言,我就这样一直相信下去,知道发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled(编译)的缩写才对啊!
为了防止其他学习python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。
3、解释型语言和编译型语言
计算机是不能够识别高级语言(PHP、python、JAVA等语言都算是高级语言)的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
解释型语言(Ruby、python、PHP等(边解释边执行))就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。
此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。
用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
4、python到底是什么
其实python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下python程序的运行过程吧。
当我们在命令行中输入python hello.py时,其实是激活了python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一行工作和Java一样,是编译。
熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序。
java hello.java
java hello
只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述python,python是一门先编译后解释的语言。
5、简述python的运行过程
在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当python程序运行结束时,python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
6、解释型语言与编译型语言的区别举例
解释型语言:跟外国人沟通的时候,翻译员一句一句的将交谈的对话一句一句翻译给外国人听
编译型语言:跟外国人沟通的时候,直接先将中文文件翻译成英文的再交给他,这样他看到的就全部都是英文文件
执行test.py文件的时候,生成的时候auth.pyc的文件,模块被别人导入的程序,运行的时候就会生成pyc文件,用test导入auth模块,生成一个auth.pyc文件之后,如果后面在auth.py文件中修改了代码的话,在下次运行的过程中,会比较auth.py跟auth.pyc修改时间的对比,如果.py的修改时间比较新的话就会重新编译生成一个新的.pyc文件,更新到之前的.pyc文件中
备注:部分资料参考金角大王的python基础培训资料
二、常用数据类型
1、数字
备注:在python语言里面,如果声明变量的话是不需要规定变量的类型的(整形、字符串),这是python的特性,在其他编程语言中就需要进行定义变量的类型哦。
#C语言 int age 18 long age 22 str name ‘alex‘ #python age = 18 2**31
int :整形
不同机器上面的取值范围如下图所示
举例:2、3、4、5、6。
long:长整形
float:浮点型
complex:复数
2、布尔值
具体定义如下图所示:
只有0跟1有False跟True,其他数字不能用True和False来判断
0 = False
1 = True
3、字符串
格式:"hello world"
字符串拼接:
每次创建字符串时候需要在内存中开辟一块连续空间,如果修改了字符串的话,就会再继续开辟一块空间
#占用一块内存空间 name = ‘haha‘ print(‘i am %s‘ % name)
如果用+号进行拼接的字符串的话,就表示+号每出现一次的话就会重新在内存中开启一块空间,1+加号的数目 = 占用的内存块
#占用3个内存空间 name = ‘hahahha‘ print(‘my name is‘+ name +‘and you?‘)
字符串格式化输出
name = ‘haha‘ print(‘i am %s‘ % name)
#打印出来:i am haha
备注:
%s:字符串
%d:整数
%f:浮点数
常用功能
移除空白
分割
长度
索引
切片
三、列表
创建列表
name_list = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] 或 name_list = list([‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘])
基本操作
索引
切片:一次性取多个值
追加
删除
长度
查询
例子
通过一个变量,将全部的名字都存储出来
方式一、同一个变量存储多个数据
为嘛不可取?-->只能取出全部的数据,不能取出个别的数据
name = "wangdaha,wangerha,wangsanha,wangsiha,......." print(name)
#打印结果
#wangdaha,wangerha,wangsanha,wangsiha,.......
方式二、多个变量存储多个数据
为嘛不可取?-->需要变量跟定义的数值一一对应才可以正确的查询到对应要查询的数据(不现实,没有达到想要查询的目的)
如果要查找的变量没有定义数值的话,运行之后报错为:ValueError: not enough values to unpack (expected 5, got 4)
name1,name2,name3,name4=‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘ print(name1)
#打印结果
#wangdaha
方式三、利用列表存储数据
为嘛有列表?
人们为了解决上面方式一、二种存储多个数据的情况,发明了“列表(list)”(只有在python 中称呼为列表,在其他语言中称之为数组)
如何定义变量和数字?
列表中定义数字如下面所示,不需要引号,直接写入存储的数值即可;定义变量需要先定义,再直接引用定义好的变量
列表格式
一个中括号开始,另一个中括号表示结束。
啥是元素?
列表中的每一个值称之为元素
啥是索引值?
列表里面可以存储任何的数值(字符串、变量、数字等),并且数值之间用逗号进行隔开;
索引值就是表示元素的位置,都是从0开始计算的。
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] print(name) name1 = name[2] name2 = name[0] name3 = name[1] print(name1,name2,name3) #打印结果: # [‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] --》对应print(name) #wangsanha wangdaha wangerha ---》对应printprint(name1,name2,name3)
列表的部分相关操作
取最后一个索引
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] name1 = name[-1] print(name1) #打印结果: # 8
切片(一次性取多个值)
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] name1 = name[0:3] print(name1) #打印结果: # [‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘]--》取的是索引值分别为:0、1、2 #顾首不顾尾(取的结果包括前面的索引值,但是不包括后面的索引值)
取后面几个值
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] #倒着取值 name1 = name[-1:-5] print(name1) #打印结果:[] #开始:列表的左边,结束:列表的右边,上面的写法表示的是从-1开始取,所以取不到数据,不能倒着取,只能正着取 #正确的取法 name1 = name[-5:-1] print(name1) #打印结果:[‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34]
取第一个、最后一个、全部元素
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘]
age = 8
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] name1 = name[1:] print(name1) name2 = name[:] print(name2)
print(name) name3 = name[:4] print(name3) name4 = name[0:4] print(name4) #打印结果: #[‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] 取最后一个元素 #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] 取全部元素 #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] 取全部元素 #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘] 取前面一个元素 #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘] 取前面一个元素
多次取值
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] name1 = name[1:] print(name1) name2 = name[1:][2:4] print(name2) name3 = name[1:][2:4][0] print(name3) name4 = name[1:][2:4][0][1] print(name4) #打印结果: #[‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] 打印所有元素 #[‘wangsiha‘, 34] 从所有元素当中取出索引值为2、3的元素 #wangsiha 从取出的索引值为2、3的元素中取出索引值为0的元素 #a 从取出的索引值为2、3的元素中取出索引值为0的元素中取出索引值为1的元素
修改元素值
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘] age = 8 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34,age] name[0] = "wei wangdaha" print(name) #打印结果: #[‘wei wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, 8] #先找到需要修改的函数在修改
插入值-insert
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34] #正数插入 name.insert(2,‘wang xiaoxiao‘) print(name) #打印结果: #[‘wangdaha‘, ‘wangerha‘, ‘wang xiaoxiao‘, ‘wangsanha‘, ‘wangsiha‘, 34] #往索引值=2的前面插入 #负数插入 name.insert(-2,‘wang erxiao‘) print(name) #打印结果: #[‘wangdaha‘, ‘wangerha‘, ‘wang xiaoxiao‘, ‘wangsanha‘, ‘wangsiha‘, ‘wang erxiao‘, 34] #索引值=-2的前面插入
追加-append
只能是往最后面的一个数后面追加元素,其他位置不可以
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34] name.append(‘wang xiaoxiao‘) print(name) #打印结果: #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34, ‘wang xiaoxiao‘] #只能是往最后面的一个数后面追加元素,其他位置不可以
删除-remove
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,34] name.remove(‘wangdaha‘) print(name) #打印结果: #[‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, 34] #删除掉wangdaha
多个删除--del
del可以删除任何东西:变量、列表、删除内存中的数据
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] del name[3:5] print(name) name1 = ‘haha‘ del name1 print(name1) del name print(name) #打印结果: #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘lidada‘, ‘lixiaoer‘] 删除‘wangsiha‘,‘wangxiaoxiao‘(删除内存中的数据) #NameError: name ‘name1‘ is not defined 删除变量name1 所以会提示找不到变量name1 #NameError: name ‘name‘ is not defined删除列表name 所以会提示找不到列表name
POP删除
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] name.pop() print(name) name.pop(1) print(name) #打印结果: # [‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘] 默认删除最后一个 #[‘wangdaha‘, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘] 删除的时候填写的是下标,remove填写的是元素
POP方法、remove方法、del方法对比
中途练习
需求
写一个列表,列表里包含本组所有成员名字
1、往中间的位置插入两个临组成员的名字
2、取出第三-第八的人列表
3、删除第7个人
4、把刚才加入的那2个其他组的人,一次性删除(remove只能一次性删除一人)
5、把组长的名字加上组长备注
6、每个一个人打印一次(步长)
思维导图
代码
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] name.insert(3,‘A‘) name.insert(4,‘B‘) print(name) name1 = name[2:9] print(name1) name.remove("wangxiaoxiao") print(name) del name[3:5] print(name) name[0] = ‘xiugai wangdaha‘ print(name) name2 = name[::2] print(name2) #打印结果: #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘A‘, ‘B‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘, ‘lixiaoer‘] 往wangsiha前面分别加入A跟B #[‘wangsanha‘, ‘A‘, ‘B‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘, ‘lixiaoer‘ 打印出来第3-8个元素 #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘A‘, ‘B‘, ‘wangsiha‘, ‘lidada‘, ‘lixiaoer‘] 删除wangxiaoxiao #[‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, ‘lidada‘, ‘lixiaoer‘] 删除A跟B,删除多个人 remove只能删除一个人,删除全部或者是多个人需要用del #[‘xiugai wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, ‘lidada‘, ‘lixiaoer‘] 修改wangdaha为xiugai wangdaha #[‘xiugai wangdaha‘, ‘wangsanha‘, ‘lidada‘] 取出全部并且步长为2的元素(隔一个取一个)
查询多个元素(列表中的元素无数多)
判断一个列表中是否存在一个元素9
方法一
从头到尾查询是否有我们要的元素---不现实呐!
方法二
判断9是否在列表里面
name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] if 9 in name: print(‘9 is in name‘) else: print(‘no‘) #打印结果: no
统计列表name中有几个9--count方法
name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] if 9 in name: num_of_ele = name.count(9) print( ‘[%s] 9 is/are in name‘%num_of_ele) #打印结果: [4] 9 is/are in name
查找索引--index方法
name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] if 9 in name: num_of_ele = name.count(9) position_of_ele = name.index(9) print(‘[%s] 9 is/are in name,position:[%s]‘ %(num_of_ele,position_of_ele))
#打印结果: [4] 9 is/are in name,position:[2] #统计到name列表里面有4个9 并且第一个9的索引值=2 #count :统计次数 #index:查询第一个9的位置,查询到之后就不会在进行查询下去,直接打印出来
将name列表中的9修改为999
1、修改name列表中的第一个9为999
如下面代码,我们已经修改了第一个9为999了,但是在第一个打印结果中的9还是4个,第一个9的索引值还是等于2;
因为是在之前就定义为一个变量position_of_ele,然后在执行修改9的操作,而不是在num_of_ele这个变量中进行操作的,所以显示出来的一直都是。
#修改name列表中的第一个9为999 name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] if 9 in name: num_of_ele = name.count(9) position_of_ele = name.index(9) name[position_of_ele] = 999 print(‘[%s] 9 is/are in name,position:[%s]‘ %(num_of_ele,position_of_ele)) print(name) #打印结果: [4] 9 is/are in name,position:[2] 统计到name列表里面有4个9 并且第一个9的索引值=2 #[‘wangdaha‘, ‘wangerha‘, 999, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 9, ‘lidada‘, ‘lixiaoer‘, 9, 99, 9, 999]
2、利用for循环,将name列表中所有的9修改为999
name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] for i in range(name.count(9)): position_of_ele = name.index(9) name[position_of_ele] = 999 print(name) #打印结果: #[‘wangdaha‘, ‘wangerha‘, 999, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 9, ‘lidada‘, ‘lixiaoer‘, 9, 99, 9, 999] #[‘wangdaha‘, ‘wangerha‘, 999, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 999, ‘lidada‘, ‘lixiaoer‘, 9, 99, 9, 999] #[‘wangdaha‘, ‘wangerha‘, 999, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 999, ‘lidada‘, ‘lixiaoer‘, 999, 99, 9, 999] #[‘wangdaha‘, ‘wangerha‘, 999, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 999, ‘lidada‘, ‘lixiaoer‘, 999, 99, 999, 999] #通过count找出需要循环的次数,再找到我们需要的9当前所在的位置,返回它的索引,将9修改成我们所需要的数字,再次进行循环操作
合并列表--extend
将name2列表合并到name列表中,就是将name2列表中的元素添加在name列表的后面
name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] name2 = [‘haha‘,‘haha1‘,‘haha2‘] name.extend(name2) print(name) #打印结果:[‘wangdaha‘, ‘wangerha‘, 9, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, 9, ‘lidada‘, ‘lixiaoer‘, 9, 99, 9, 999, ‘haha‘, ‘haha1‘, ‘haha2‘] #name2列表追加到name列表里面,但是 name2列表还是存在的,只是复制了一个name2的值而已
反转操作--reverse
name = [‘wangdaha‘,‘wangerha‘,9,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,9,‘lidada‘,‘lixiaoer‘,9,99,9,999] name.reverse() print(name) #打印结果:[999, 9, 99, 9, ‘lixiaoer‘, ‘lidada‘, 9, ‘wangxiaoxiao‘, ‘wangsiha‘, ‘wangsanha‘, 9, ‘wangerha‘, ‘wangdaha‘] #将name列表中的元素倒过来显示
排序--sort
#列表中的元素全部是字符串 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] name.sort() print(name) #打印结果:[‘lidada‘, ‘lixiaoer‘, ‘wangdaha‘, ‘wangerha‘, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘] #按照ascii码表中的字母顺序进行排列
#列表中的元素全部是数字 name1 = [3,3,3,5,5,6,78,7,8,8] name1.sort() print(name1) #打印结果:[3, 3, 3, 5, 5, 6, 78, 7, 8, 8] #按照数字的顺序进行排序 #列表中包含数字和字符串 name2 = [‘hhah‘,‘hhahha‘,‘wsod‘,‘dsadads‘,8,8,9,3,2,] name2.sort() print(name2)
#打印结果:TypeError: unorderable types: int() < str() #字符串跟数字不能一起排序,但是 python2中会根据ascii码表进行排序,不会报错
复制列表-copy
修改大列表里面的元素是不会同步到copy后到列表的
#单个列表 name = [‘wangdaha‘,‘wangerha‘,‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,‘lidada‘,‘lixiaoer‘] name1 = name.copy() name[1] = 8 print(name) print(name1) #打印结果: # [‘wangdaha‘, 8, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘] name列表 #[‘wangdaha‘, ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, ‘lidada‘] name1列表
列表中可以嵌套N个列表
修改大列表里面的元素是不会同步到copy后到列表的,但是如果是修改小列表中的元素的话,就会同步到copy后的列表中
自己创建的小列表是一个独立的内存段,大列表中的小列表只是存储了这个小列表的内存地址,小列表的内存地址指向这个大列表的而已,并不是直接是内存段
如果使用的是copy方法的话,python默认的是只copy第一层,深层的东西不进行copy,第二层数据量有可能非常大,所以只copy第一层。
小列表中这块的只是指向其他地方的内存地址。copy的只是个地址;修改的话修改的是列表指向的内存地址,地址所对应的数据并没有被copy。
#列表中嵌套列表并进行修改name列表 name = [‘wangdaha‘,‘wangerha‘,[8,‘hahk‘,‘dsdd‘],‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,[8,‘sad‘,7],‘lidada‘,‘lixiaoer‘] name1 = name.copy()
name[1] = 8 name[2][0] = ‘gg‘
print(name) print(name1) #打印结果: # [‘wangdaha‘, 8, [‘gg‘, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘] name列表 #[‘wangdaha‘, ‘wangerha‘, [‘gg‘, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘] name1列表
copy标准库
浅copy--copy方法(只是做了一个软连接)
与上面的copy方法一样,只是浅层的copy,原理与上面解释的原理一样,copy的小列表中的元素只是内存地址
import copy name = [‘wangdaha‘,‘wangerha‘,[8,‘hahk‘,‘dsdd‘],‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,[8,‘sad‘,7],‘lidada‘,‘lixiaoer‘] name1 = copy.copy(name) name[1] = 8 name[2][0] = ‘gg‘ print(name) print(name1) #打印结果: # [‘wangdaha‘, 8, [‘gg‘, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘] name列表 #[‘wangdaha‘, ‘wangerha‘, [gg, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘]
深copy--deepcopy方法(完全克隆一份,两个列表完全独立,修改之后的列表完全不会影响到copy的列表)
import copy name = [‘wangdaha‘,‘wangerha‘,[8,‘hahk‘,‘dsdd‘],‘wangsanha‘,‘wangsiha‘,‘wangxiaoxiao‘,[8,‘sad‘,7],‘lidada‘,‘lixiaoer‘] name1 = copy.deepcopy(name) name[1] = 8 name[2][0] = ‘gg‘ print(name) print(name1) #打印结果: # [‘wangdaha‘, 8, [‘gg‘, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘] name列表 #[‘wangdaha‘, ‘wangerha‘, [8, ‘hahk‘, ‘dsdd‘], ‘wangsanha‘, ‘wangsiha‘, ‘wangxiaoxiao‘, [8, ‘sad‘, 7], ‘lidada‘, ‘lixiaoer‘]
python基础3