• 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

    改:先删再加

    其他操作

    & | - ^ > <

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

  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11178081.html
Copyright © 2020-2023  润新知