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‘]
时间: 2024-08-02 07:02:05

python基础3的相关文章

linux+jmeter+python基础+抓包拦截

LINUX 一 配置jdk 环境 *需要获取root权限,或者切换为root用户 1.windows下载好,去 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 官方网站下载jdk(linux相应版本) 2.在usr目录下创建java路径文件夹 [root bin]cd /usr mkdir java 3.将jdk-8u60-linux-x64.tar.gz放到刚才创建的文件夹下

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python基础入门 (一)

一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: Python 2.x is legacy, Python 3.x is the present and future of the language Python 3.0 was released in 2008. The final 2.x version 2.7 release came out

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

python基础教程(第二版)

开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3章使用字符串 python基础第4章字典 python基础第5章循环 python基础第6章函数和魔法参数 python基础第7章类 python基础第8章异常 python基础第9章魔法方法.属性和迭代器 python基础第11章文件 python基础第12章GUI(wxPython) pytho

python基础周作业

python基础周作业 1.执行python脚本的两种方法 脚本前面直接指定解释器 在脚本开始前声明解释器 2.简述位,字节的关系 每一个字节占用八个比特位 3, 简述ascii.unicode.utf- ‐8.gbk的关系 utf--‐8 <-- unicode <-- gbk <-- ascii 按此方向兼容 4..请写出"李杰"分别用utf- ‐8和gbk编码所占的位数 "李杰" 占用utf -8 占6字节 , gbk 占用4字节 5.pyt

Python基础(二)

Python基础(二) Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典.set集合) for 循环 enumrate range和xrange 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python学习笔记(一)python基础与函数

1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world >>> print 300 300 >>> print 100+200 300 print语句也可以跟上多个字符串,用逗号","隔开,就可以连成一串输出: >>> print 'The quick brown fox', 'jumps over