Day 6 小数据池,深浅拷贝以及集合详解

小数据池---缓存机制(驻留记住)

== 判断两边内容是否相等

is
a = 10
b = 10
print(a is b) is判断基于内存地址

小数据池的数字范围:-5~256

代码块:一个py文件,一个函数,一个类,一个模块,终端中每一行都是一个代码块
支持:
数字:在同一代码块下,只要内容相同就采用相同的内存地址(-6之后,∞)
在做乘法的时候范围 -5~256 *******
在做乘法的时候不能使用浮点数

字符串
在同一代码块下,只要内容相同就采用相同的内存地址
在乘法的时候总长度不能超过20******
乘法的时候中文,特殊符号乘1或0

布尔值
在同一代码块下,只要内容相同就采用相同的内存地址

小数据池:-5~256规则
数字-5~256*********
字符串:
在同一代码块下,只要内容相同就采用相同的内存地址
在乘法的时候总长度不能超过20 **********
乘法的时候,特殊符号乘0
布尔值
在同一代码块下,只要内容相同就采用相同的内存地址

小数据池的验证方法,必须脱离代码块才能执行
先执行代码块的规则,在执行小数据池的规则(驻留机制)

必会
== 判断两边的值是否相等******
is 判断两边的内存地址是否相等****

深浅拷贝 复制
面试必问,赋值,浅拷贝,深拷贝

浅拷贝
lst = [1,2,3,[5,6,7]]
lst1 = lst
print(lst)
print(lst1)#地址一样

import copy
lst = [1,2,3,[5,6,[1,2,3]]]
lst1 = lst.copy()
lst[-1].remove(5)
lst1[-1].append(1)
lst[-1][0] = 10
print(lst)
print(lst1)
浅拷贝,只拷贝第一层
增删第一层的时候,修改一个,另一个不变
增删第二层的时候,修改一个,另一个变
增删第N层的时候, 修改一个,另一个变
修改第一层的时候,修改一个,另一个不变
修改第二层的时候,修改一个,另一个变
修改第N层的时候, 修改一个,另一个变
深拷贝
import copy
lst = [1,2,3,[5,6,[1,2,3]]]
lst1 = copy.deepcopy(lst)
lst[-1][-1].remove(1)
lst[-1][-1].append(10)
lst1[-1][-1][0] = 10
print(lst)
print(lst1)
深拷贝,不可变元素公用,可变元素新开辟一个,
可变元素里面的值公用。
增删第一层的时候,修改一个,另一个不变
增删第二层的时候,修改一个,另一个不变
增删第N层的时候, 修改一个,另一个不变
修改第一层的时候,修改一个,另一个不变
修改第二层的时候,修改一个,另一个不变
修改第N层的时候, 修改一个,另一个不变

总结:
浅拷贝的时候只拷贝第一层元素
浅拷贝在修改第一层元素(不可变数据类型)的时候,拷贝出来的新列表不进行改变
浅拷贝在替换第一层元素(可变数据类型)的时候,拷贝出来的新列表不进行改变
浅拷贝在修改第一层元素中的元素(第二层)的时候,拷贝出来的新列表进行改变

深拷贝开辟一个容器空间(列表),不可变数据公用,可变数据数据类型(再次开辟一个新的空间)
,空间里的值是不可变的数据进行共用的,可变的数据类型再次开辟空间

集合 -- set
没有值得字典 无序 -- 不支持索引
天然去重 *****

定义集合
s = {1,"alex",False,(1,2,3),12,1,12,4,6,32,2,4}
print(s)

面试题:
lst = [1,2,1,2,4,2,45,3,2,45,2345,]
print(list(set(lst)))

s = {1,2,3,4}

增:

s.add('1') #只能添加一个(字符串,数字,元组)
print(s)
s.update("今天") # 迭代添加
print(s)

删:
print(s.pop()) # pop有返回值
print(s)
s.remove(3) # 指定元素删除
print(s)
s.clear() # 清空 -- set() 空集合
print(s)

改:
先删在加

查:
for i in {1,2,3}:
print(i)

其他操作:
s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7,1}
print(s1 & s2) # 交集
print(s1 | s2) # 并集
print(s1 - s2) # 差集
print(s1 ^ s2) # 反交集
print(s1 > s2) # 父集(超集)
print(s1 < s2) # 子集

print(frozenset(s1)) # 冻结集合 更不常用
dic = {frozenset(s1):1}
print(dic)

今日总结
1.小数据池:
1.1代码块: 一个文件,一个函数,一个类,一个模块,终端中每一行
1.1.1 数字: -5 ~ 256
1.1.2 字符串: 乘法时总长度不能超过20
1.1.3 布尔值: 内容相同内存地址相同
1.2 小数据池:
1.2.1 数字: -5 ~ 256
1.2.2 字符串: 乘法时总长度不能超过20
1.2.3 布尔值: 内容相同内存地址相同
1.3 先执行代码块后执行小数据池
1.4 == is
1.4.1 == 判断等号两边值是否相等
1.4.2 is 判断两边的值内存地址是否相等

2.深浅拷贝
2.1 赋值:
多个变量名指向同一个内存地址
一个变量对其进行操作,其他变量查看时都变动
2.2 浅拷贝:
lst[1:10] -- 是浅拷贝
浅拷贝只拷贝第一层元素
修改第一层元素的时候,新开辟的不进行改变
2.3 深拷贝:
不可变的数据类型共用,可变的数据类型重新开辟一个空间
对源数据进行修改,深拷贝的内容不进行改变

  1. 集合
    3.1 集合是没用值得字典
    3.2 集合是无序,可变的
    3.3 集合天然去重
    3.4
    增:add ,update
    删:pop remove clear
    改:先删后加
    查: for循环
    3.5 其他操作:
    & 交集
    | 并集
    - 差集
    ^ 反交集
    > 超集
    < 子集
    frozenset() 冻结集合
    3.6 面试题:
    list(set(要去去重的数据))
posted @ 2019-07-12 23:11  犇羴鱻龘毳  阅读(133)  评论(0编辑  收藏  举报