Python学习——Day06

python学习——Day06

1.id is ==

1.id

变量在内存中的地址

i = 100
s = 'a'
print(id(i))
print(id(s))

运行结果:

140720040685040
1893144063728

第二次运行

140719965842928
2208559722224

int类型在内存中的地址是固定的, 但是str类型是不固定的

2.==

比较运算符 ----用来判断两个变量是否 值相等

i1 = 100
i2 = 100
print(i1 == i2)		#True

3.is

用来判断两个变量是否 地址相同

i1 = 100
i2 = 100
s1 = 'a'
s2 = 'a'
l1 = [1,2,3]
l2 = [1,2,3]
print(id(i1))	#140719965842928
print(id(i2))	#140719965842928
print(id(s1))	#1993600265968
print(id(s2))	#1993600265968
print(id(l1))	#1993570865544
print(id(l2))	#1993570866056
print(i1 is i2)	#True
print(s1 is s2)	#True
print(l1 is l2)	#False

2.代码块

  • 所有的代码都需要依赖代码块执行

  • 一个文件就是一个代码块

  • 交互式命令一行就是一个代码块

    image-20200619094151798

    两个代码块

3.两个机制

  • 同一个代码块下,遵循一个机制,不同的代码块下,遵循另一个机制

1.同一个代码块内的缓存机制(字符串驻留机制)

机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值已经存在,如果存在,会将其重用. 换句话说: 执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先在字典中查询记录, 如果有同样的记录他会重复使用这个字典中的之前的这个值.

​ 所以在文件执行同一个代码块时,会把i1, i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即: id相同

适用对象: int bool str

2.不同代码块内的缓存机制: 小数据池

机制内容: Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

​ python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

​ 无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

适用对象: int (float), str,, bool

4.集合

  • 容器型的数据类型, 要求它里面的元素是不可变的数据, 但是它本身是可变的数据类型. 集合是无序的. 用{}括起来
  • 集合的作用:
    • 列表的去重
    • 关系测试: 交集, 并集, 差集....

1.集合创建

s1 =  set({1, 2, 'aaa', False})
s2 = {1, 2, 'aaa', False}	#常用

2.空集合

print(type({}))     #<class 'dict'>
  • {}是空字典 不是空集合

set()---空集合

print(type(set()))      #<class 'set'>

5.集合的基本操作

1.增

set1 = {'aa', 'ss', 'dd'}
set1.add('xx')      #{'xx', 'dd', 'ss', 'aa'}

输出乱序是因为集合是无序的!!!

set1.update('qwe') 
#{'q', 'dd', 'aa', 'e', 'w', 'xx', 'ss'}

update() ---迭代着增加

2.删

  • remove() ---- 按照元素删除
set1.remove('aa')  
#{'dd', 'q', 'e', 'xx', 'ss', 'w'}
  • pop() ----随机删除
set1.pop()          #{'ss', 'dd', 'e', 'w', 'xx'}

3.变相改值

可以将一个值删除, 然后增加新的值

4.交集 (& )

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}
print(s1 & s2)      #{4, 5}

5.并集 (|)

print(s1 | s2)      #{1, 2, 3, 4, 5, 6, 7, 8}

6.差集(-)

print(s1 - s2)      #{1, 2, 3}

7.反交集(^)

print(s1 ^ s2)      #{1, 2, 3, 6, 7, 8}

8.子集(<)

s1 = {1,2,3}
s2 = {1,2,3,4,5}
print(s1 < s2)      #True

9.超集(>)

s1 = {1,2,3}
s2 = {1,2,3,4,5}
print(s2 > s1)      #True

10.列表的去重

转化为集合

l1 = [1,2,2,2,3,3,3,4,5,5,6,6,6]
set1 = set(l1)
print(set1)     #{1, 2, 3, 4, 5, 6}

再将集合转换为列表

l1 = list(set1)
print(l1)       #[1, 2, 3, 4, 5, 6]

6.深浅copy

1.赋值运算

l1 = [1,2,3,[22,33]]
l2 = l1
l1.append(66)
print(l1)
print(l2)
#[1, 2, 3, [22, 33], 66]
#[1, 2, 3, [22, 33], 66]

l1 l2 指向同一个内存地址

2.浅copy

l1 = [1,2,3,[22,33]]
l2 = l1.copy()
l1.append(66)
print(l1,id(l1))
print(l2,id(l2))
#[1, 2, 3, [22, 33], 66]  1768673137544
#[1, 2, 3, [22, 33]]   1768674415880
l1 = [1,2,3,[22,33]]
l2 = l1.copy()
l1[-1].append(66)
print(id(l1[-1]))
print(id(l2[-1]))
#1443906539912
#1443906539912

print(id(l1[0]))	#140720062374288
print(id(l2[0]))	#140720062374288

image-20200620142037056

  • 另一种写法:
import copy
l1 = [1,2,3,[33,44]]
l2 = copy.copy(l1)

3.深copy

import copy
l1 = [1,2,3,[22,33]]
l2 = copy.deepcopy(l1)
print(id(l1))	#1616669126280
print(id(l2))	#1616669042568
l1[-1].append(666)
print(l1)	#[1, 2, 3, [22, 33, 666]]
print(l2)	#[1, 2, 3, [22, 33]]

image-20200620143529268

python对深copy做了一个优化, 将不可变的数据类型沿用同一个

image-20200620143649867

image-20200620143801553

总结:深copy会在内存中开辟新空间,将原列表以及列表里面的可变的数据类型重新创建一份,不可变的数据类型则沿用之前的.

归纳:

  • 浅copy : list dict : 嵌套的可变的数据类型是同一个
  • 深copy : list dict : 嵌套的可变的数据类型不是同一个

所谓的嵌套的数据类型是 比如 一个列表中存在一个小的列表

posted @ 2020-06-21 23:16  大明举重冠军  阅读(58)  评论(0)    收藏  举报