zoukankan      html  css  js  c++  java
  • 驻留机制

    day06

    驻留机制

    • is:判断is两边是否相同

      • is 是通过内存地址判断的
    • ==:判断等号两边是否相同

      a = 1 b = 2 print(a is b) #判断a是不是b

    • 小数据池(终端测试)

      1. 数字地址相同的范围:-5~256地址相同
      2. 字符串:除去特殊符号,中文,内容相同,地址就相同
      3. python3.6 字符串进行乘法时,总长度不超过20
      4. python 3.7 字符串进行乘法时,总长度不超过4096
    • 代码块(pycharm环境)

      • 定义:一个py文件、一个函数、一个模块、一个类、交互模式下的每一行代码
      • 先执行代码块,小数据池
      1. 数字地址相同的范围:-5~正无穷
      2. 字符串:定义时,长度不限,内容相同就驻留(地址相同)
      3. 字符串进行乘法时,除去中文,特殊符号总长度不超过20

    深浅拷贝

    赋值

    • 定义:多个变量名指向同一个内存地址

      a = 2
      b = a
      #a,b都指向2的内存地址
      
      a = 2           #不可变数据类型
      b = a           
      a = 11          #开辟空间,指向新的内存地址
      print(a,b)
      

      lst = [1,2,3,4]         #可变数据类型
      lst1 = lst              #lst和lst1指向同一个地址列表
      lst = [5,6,7,8]         #lst开辟新的空间,指向新的地址
      print(lst,lst1)
      
      dic = {"key2":[1,2,3]}   #可变数据类型
      dic1 = dic               #两个变量指向同一个字典的地址
      dic1["key2"].append(5)   #对字典地址的只改变
      print(dic,dic1)          #结果都改变
      

    • 总结:

      1. 当多个变量名指向同一个地址时,如果这个变量的数据是

        1. 修改时,不可变数据类型,新开辟空间变量名指向新的地址空间(数字,字符串)
        2. 修改时,可变数据类型,在原地址修改(字典,列表)

    浅拷贝

    lst = [1,2,3,4]
    lst1 = lst.copy()
    print(lst,lst1)                   #两者一样,浅拷贝是新开辟空间,lst1指向新的开辟空间
    lst1.append(5)                    #在新的空间数据进行操作
    print(lst)                        #结果为:[1,2,3,4]
    

    • 浅拷贝的另一种方法

      lst = [1,2,[3,4]]
      lst1 = lst[:]  # 浅拷贝
      lst1[-1].append(5)
      print(lst,lst1)
      
      lst = [1,2,3,4]
      lst1 = lst                      #lst和lst1指向同一个列表内存地址
      lst2 = lst[:]                   #lst2新开辟地址空间,其中元素是与lst共用的,因此元素的地址相同
      lst.append(5)                   #是在lst内部新开辟空间指向5
      print(lst,lst1,lst2)            #结果是:[1,2,3,4,5][1,2,3,4,5][1,2,3,4]
      

    深拷贝

    使用深拷贝时,必须使用improt copy引入copy模块才能使用深拷贝

    improt copy
    lst = [1,2,[3,4],5]
    lst1 = copy.deepcopy(lst)
    print(id(lst),id(lst1))             #地址不同,开辟新的空间
    print(id(lst[0]),id(lst1[0]))       #拷贝元素中,不可变数据类型共用,因此地址相同
    print(id(lst[2]),id(lst1[2]))       #拷贝元素中,可变数据类型开辟新的空间,因此地址不同
    

    • 总结:

      1. 浅拷贝,只拷贝数据第一层的内存地址,咱们能看到是因为,根据内存地址去查找对应的值
      2. 深拷贝,开辟新的空间后,可变数据类型开辟新的空间,不可变数据类型共用

    集合

    关键字 set

    空集合 set()

    集合的定义

    s = set()
    

    集合:集合就是一个没有值得字典

    面试题:集合可以天然去重,元素都是唯一的,且可哈希

    lst = [1,2,3,4,1,1,12,33,3,421,21,12,3]
    print(list(set(lst)))                 #转换成集合可以去重
    

    集合:是无序的,不支持索引,可变,可迭代

    集合的增

    set.update()

    s = {1,2,3,4}
    s.update(5)             #迭代添加,整型是不可迭代,所以不能用update添加整型
    print(s)          
    

    set.add()

    s = {1,2,3,4}
    s.add(5)
    print(s)
    

    集合的删

    set.pop() 随机删除

    s = {1,2,3,4}
    s.pop()               #随机删除,默认删除最小的,自动根据大小排序
    print(s)
    

    set.clear() 清空集合

    s = {1,2,3,4}
    s.clear()               #清空集合所有的元素
    print(s)                #结果为set()
    

    s.remove(元素) 根据指定元素删除

    s = {1,2,3,4}
    s.remove(4)           #删除元素4
    print(s)               #查看
    

    集合的改

    删完在加

    集合的查

    集合可迭代,for循环可查

    集合的关系

    交集: &

    并集:|

    补集(反差集):^

    差集:-

    子集:<

    父集(超集):>

  • 相关阅读:
    关于字节对齐以及内存占用
    关于HandlerThread的分析
    关于栈和队列的相关操作
    自定义控件(View的绘制流程源码解析)
    关于采用github.io搭建个人博客
    算法题解
    关于Android中ArrayMap/SparseArray比HashMap性能好的深入研究
    ADB server didn't ACK * failed to start daemon *
    Handler 、 Looper 、Message
    KMP字符串模式匹配详解(转)
  • 原文地址:https://www.cnblogs.com/g15009428458/p/12170918.html
Copyright © 2011-2022 走看看