zoukankan      html  css  js  c++  java
  • 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

    改:先删再加

    其他操作

    & | - ^ > <

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

  • 相关阅读:
    重复打印文件首行n次
    考PMP证书总结
    @click @dblclick @keyup 等事件不起作用
    element-ui table 表格内出现一根横线???
    windows 鼠标拖动应用顶部移动 , 向下还原 , 自动最大化的设置
    【.NET】使用 XmlDocument 查找带命名空间的节点
    【WinForms】DataGridView自动调整列宽度以及最后一列宽度填充
    时间返回格式统一处理的几种办法
    hexo使用
    hexo搭建个人博客网站
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11178081.html
Copyright © 2011-2022 走看看