python 第六章 小数据池+深浅拷贝+集合

python 第六章

小数据池

# == 判断两边内容是否相等
a = 10
b = 10
print(a == b)# 判断a是否等于b
# 输出 True

# is 是 基于内存地址进行判断,用id判断
# 相同输出相同内容,否则输出id不同
# pring(id(数据类型))
# 查看内存地址
a = 10
b = 10
print(id(a))
# 输出4401028560
print(id(b))
# 输出4401028560
print(a is b)
# 输出False

# 代码块 -- 一个文件,函数,类,模块,终端的每一行
# 代码块支持范围:
# 数字:
# 同一代码块下,只要内容相同就采用相同的内存地址,-5以后就不是,正无穷
# 在做乘法的时候范围 -5~256  ***
# 在做乘法的时候不能使用浮点系
# 
# 字符串:
# 同一代码块下,只要内容相同就采用相同的内存地址
# 乘法的时候总长度不能超过20
# 乘法的时候中文,特殊符号只能乘以1或0
# 
# 布尔值:
# 同一代码块下,只要内容相同就采用相同的内存地址
# 
# 
# 小数据池 -- 缓存机制(驻留机制)
# 小数据池支持的范围
# 数字:
# -5~256 ***
# 
# 
# 字符串:
# 同一代码块下,只要内容相同就采用相同的内存地址
# 乘法的时候总长度不能超过20   ***
# 乘法的时候中文,特殊符号只能乘以0
# 
# 布尔值:
# 同一代码块下,只要内容相同就采用相同的内存地址
# 
# 验证方法,必须脱离代码块才能验证
# 
# 优先级:
# 代码块 >  小数据池(驻留机制)
# 在终端中操作,不需要print,直接回车返回
# 
# 必会:
# == 判断等号两边的值是否相等     ***
# is 判断两边的内容地址是否相等   ***

深浅拷贝

# 赋值 : 数据完全共享
# 浅拷贝 : 数据半共享
# 深拷贝 : 数据完全不共享
# 赋值
l1 = [1,2,3,["aa","bb"]]
l2 = l1
print(l1)
print(l2)
# 输出
# [1, 2, 3, ['aa', 'bb']]
# [1, 2, 3, ['aa', 'bb']]

# 修改元素
l2[0] = "aaa"
l2[3][0] = "bbb"
print(l1)
print(l2)
# 输出
# ['aaa', 2, 3, ['bbb', 'bb']]
# ['aaa', 2, 3, ['bbb', 'bb']]

# 浅拷贝 只拷贝第一层,第二层有变动,列表一起变动
ls1 = [1,2,3,["11","22","33"]]
ls2 = ls1.copy()# 将ls1 的内容拷贝到ls2中
print(ls2)
# 输出[1, 2, 3, ['11', '22', '33']]
# 不可变的是int,srt,tuple
# 可变的是list,set,dic

# 修改不可变类型的值,变化的只有修改的列表生效
# 修改源列表的不可变类型的值,源列表变,新列表不变
ls1 = [1,2,3,["11","22","33"]]
ls2 = ls1.copy()
ls1[0] = 0
print(ls1)
print(ls2)
# 输出 lst1变 lst2不变
# [0, 2, 3, ['11', '22', 'aaa']]
# [1, 2, 3, ['11', '22', 'aaa']]

# 修改新列表的不可变类型的值,新列表变,源列表不变
ls1 = [1,2,3,["11","22","33"]]
ls2 = ls1.copy()
ls2[0] = 0
print(ls1)
print(ls2)
# 输出 lst1不变 lst2变
# [1, 2, 3, ['11', '22', 'aaa']]
# [0, 2, 3, ['11', '22', 'aaa']]

# 修改可变类型的值,源列表和新列表均生效
# 修改源列表可变类型的值,源列表变,新列表变
ls1 = [1,2,3,["11","22","33"]]
ls2 = ls1.copy()
ls1[3][2] = "aaa"# 修改ls2 中第4个元素-列表中的第3个元素
print(ls1)
print(ls2)
# 输出 都变
# [1, 2, 3, ['11', '22', 'aaa']]
# [1, 2, 3, ['11', '22', 'aaa']]

# 修改新列表可类型的值,源列表变,新列表变
ls1 = [1,2,3,["11","22","33"]]
ls2 = ls1.copy()
ls2[3][2] = "bbb"# 修改ls2 中第4个元素-列表中的第3个元素
print(ls1)
print(ls2)
print(id(l1[-1]) == id(l2[-1]))
# 输出 都变
# [1, 2, 3, ['11', '22', 'bbb']]
# [1, 2, 3, ['11', '22', 'bbb']]


ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls1[-1]=10# 将列表看成一组,所以源不变
print(ls1)
print(ls2)


ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls2[-1]=11# 将列表看成一组,所以源不变
print(ls1)
print(ls2)











# id 内存地址的判断
# 浅拷贝:
# 源列表和新列表的内存地址不一样

ls1 = [1,2,3,[11,22,33]]
ls2 = ls1.copy()
print(id(ls1) == id(ls2))
# 输出False

# 源列表和新列表的第一层的内存地址一样

ls1 = [1,2,3,[11,22,33]]
ls2 = ls1.copy()
print(id(ls1[0]) == id(ls2[0]))


# 源列表和新列表的第二层的内存地址一样

ls1 = [1,2,3,[11,22,33]]
ls2 = ls1.copy()
print(id(ls1[3]) == id(ls2[3]))



# 深拷贝 拷贝所有,修改任意一个列表对另一个列表没有影响
import copy  # 倒入copy类
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)# ls2深拷贝ls1列表
print(ls1)
print(ls2)
# 输出
# [1, 2, 3, [11, 22, 33]]
# [1, 2, 3, [11, 22, 33]]

# 修改不可变类型的值,变化的只有修改的列表生效
# 修改源列表的不可变类型的值,源列表变,新列表不变
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
ls1[1] =11
print(ls1)
print(ls2)
# 输出
# [11, 2, 3, [11, 22, 33]]
# [1, 2, 3, [11, 22, 33]]

# 修改源列表的不可变类型的值,源列表不变,新列表变
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
ls2[1] =11
print(ls1)
print(ls2)
# [1, 2, 3, [11, 22, 33]]
# [1, 11, 3, [11, 22, 33]]


# 修改可变类型的值,变化的只有修改的列表生效
# 修改源列表可变类型的值,源列表变,新列表不变
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
ls1[3][2] = "aaa"# 修改ls2 中第4个元素-列表中的第3个元素
print(ls1)
print(ls2)
# 输出
# [1, 2, 3, [11, 22, 'aaa']]
# [1, 2, 3, [11, 22, 33]]

# 修改可变类型的值,变化的只有修改的列表生效
# 修改新列表可变类型的值,源列表不变,新列表变
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
ls2[3][2] = "aaa"# 修改ls2 中第4个元素-列表中的第3个元素
print(ls1)
print(ls2)
# 输出
# [1, 2, 3, [11, 22, 33]]
# [1, 2, 3, [11, 22, 'aaa']]

# id 内存地址的判断
# 深拷贝:
# 源列表和新列表的内存地址不一样
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
print(id(1) == id(2))
# 输出False

# 源列表和新列表的第一层的内存地址一样
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
print(id(ls1[0]) == id(ls2[0]))

# 源列表和新列表的第二层的内存地址不一样
import copy
ls1 = [1,2,3,[11,22,33]]
ls2 = copy.deepcopy(ls1)
print(id(ls1[3]) == id(ls2[3]))

# 浅拷贝:
# 只拷贝第一层,第二层有变动,列表一起变动
# 修改不可变类型的值,变化的只有修改的列表生效
# 修改可变类型的值,源列表和新列表均生效
# 修改和增删的区别
# 修改:只能改不可变数据类型,新开辟的不进行改变
# 增删改:使用可变数据类型,新开辟的进行改变
#
# 深拷贝:
# 拷贝所有,修改任意一个列表对另一个列表没有影响
#
# id 内存地址的判断
# 浅拷贝:
# 源列表和新列表的内存地址不一样
# 源列表和新列表的元素内存地址一样
#
#
# 深拷贝:
# 源列表和新列表的内存地址不一样
# 源列表和新列表的第一层的内存地址一样
# 源列表和新列表的第二层的内存地址不一样




ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls2[-1][-1] = 8
print(ls1)
print(ls2)

ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls1[-1].append(10)
print(ls1)
print(ls2)

ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls1[-1]=10# 将列表看成一组,所以源不变
print(ls1)
print(ls2)


ls1 = [1,2,3,[4,5,6]]
ls2 = ls1.copy()
ls2[-1]=11# 将列表看成一组,所以源不变
print(ls1)
print(ls2)

集合

# 集合 -- set
# 没有值的字典,只有键,无序,不支持索引
# 天然去重 ***
#
# 定义集合
s = {1,"alex",False,(1,2,3),12,1,12}
print(s)
# 输出{1,"alex",False,(1,2,3),12,1,12}

lst = [1,2,1,2,4,2,45,3,2,45,2345,]
print(list(set(lst)))# set先去重,set无序,去重后转换成list列表
# 输出[1, 2, 3, 4, 2345, 45]

# 增:add update
# s.add("键") 只能添加一个
s.add("键")
print(s)
# 输出{False, 1, 'alex', 12, '键', (1, 2, 3)}
# s.update("键")迭代增加
s.update("abc")
print(s)
# 输出{False, 1, 'b', 'c', 'alex', 12, (1, 2, 3), 'a'}


# 删:pop remove clear
# s.pop()随机删 有返回值
s.pop()
print(s)
# 输出{1, 12, (1, 2, 3), 'alex'}
# s.remove("键")指定元素删
s.remove(1)
print(s)
# 输出 {False, 'alex', 12, (1, 2, 3)}
# s.clear()清空 --set() 空集合
s.clear()
print(s)
# 输出 ()

# 改:
# 先删再加

# 查:
# for i in s:
#     print(i)

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


#冻结集合
frozenset(s1)
# 用作与字典的键

dic={frozenset(s1):1}
print(dic)

今日总结

小数据池

代码块:

一个文件、函数、类、模块,终端每一行代码

数字:-5~256

字符串:乘法总长不超过20

布尔值:内容相同内存地址相同

小数据池:

数字:-5~256

字符串:乘法总长不超过20

布尔值:内容相同内存地址相同

优先级:

先执行代码块,再执行小数据池

== 判断两边值是否相等

is 判断两边的内容地址是否相等

深浅拷贝

赋值:

多个变量名指向同一个内存地址

一个变量对其操作,其他变量查看时都变动

浅拷贝:

浅拷贝 -- lst[1:10]

只拷贝第一层元素

修改第一层元素时新开辟的不进行改变

深拷贝:

不可变的数据类型共用,可变的数据类型重新开辟一个空间

对源数据进行修改,深拷贝的内容不进行改变

集合

没用值的字典

无序,可变的

天然去重

增:add,update

删:pop,remove,clear

改:先删再加

其他操作

& | - ^ > <

交集 并集 差集 反差集 父集 子集

原文地址:https://www.cnblogs.com/zhangshan33/p/11178081.html