• 初识小数据池和深浅拷贝


    小数据池

    • == 判断两边的值是否一样

    • id 查看内存地址

    • is 判断两边值的内存地址是否一样

    • 小数据池:Python考虑到我们会经常定义一些值,需要开辟空间和销毁空 间,它底层就维护了一个小数据池,这个小数据就是规定一个区间使用的是同一个内存地址,比如小数据池中数字的区间范围是 -5 ~ 256:

    • 驻留机制:节省内存空间,提升效率

      ​ 小数据池支持int,str,bool

      ​ int: 15 ~ 256

      ​ str:

      		1. 字母,数字长度任意符合驻留机制
      
      1. 字符串乘法时总长度不能超过20
      2. 特殊符号进行乘法时只能乘以0
    • 代码块:一个py文件,一个函数,一个模块,终端中的每一行都是代码块

      ​ 代码块支持int,str,bool

      ​ int: -5 ~ 正无穷

      ​ str:

      1. 定义字符串的时候时任意的
      2. 字符串(字母,数字)进行乘法时总长度不超过20
      3. 特殊符号(中文,符号)进行乘法时乘以0或1
    • 小数据池和代码块同在的情况下先执行代码块

    深浅拷贝

    赋值,浅拷贝和深拷贝:

    • 赋值:就是一个容器有多个标签.

    • 浅拷贝:就是只拷贝第一层的元素,浅拷贝只是把原列表中记录的内存地址拿到一个新开辟的列表中

      lst = [1,2,3,[6,7,8]]
      lst1 = lst[:]		# 浅拷贝  <===>   lst1 = lst.copy()
      lst.append(9)
      print(lst)		# [1,2,3,[6,7,8],9]
      print(lst1)		# [1,2,3,[6,7,8]]
      # 为什么lst1中没有添加9?是因为先进行的浅拷贝,浅拷贝把原列表中有的内存地址复制了一份放到新开辟的空间中,后期对原列表添加的内容新列表是不会有的
      
      lst = [1,2,3,[6,7,8]]
      lst1 = lst.copy()
      lst[-1].append(9)
      print(lst)		# [1,2,3,[6,7,8,9]]
      print(lst1)		# [1,2,3,[6,7,8,9]]
      #我们对lst里的列表进行修改,列表本身就是可变的数据类型,我们通过原列表修改最里层的小列表,小列表进行变化,新开辟的列表里存放的就是小列表的内存地址,再去查看的时候就有变动
      
    • 深拷贝

      ​ 浅拷贝和深拷贝在最后列表的位置内存地址不一样,深拷贝是自己单独开辟了一个新的空间,我们现在修改原列表和新开辟的列表没有任何影响.

    • 规律:

      • 赋值:
        • 两个或多个变量名指向同一个内存地址,有一个操作内存地址的值进行改变,其余的变量名在查看的时候都进行改变
      • 浅拷贝:
        • 只拷贝列表中第一层的内存地址,原列表修改了不可变数据类型,新开辟的列表不进行变动,因为只是在原列表中将内存地址进行修改了,新开辟的列表中的内存地址还是用的之前的内存地址
        • 原列表对可变数据类型进行了添加,新开辟的列表中存放的就是可变数据类型的地址,在去查看的时候就发现进行更改了
      • 深拷贝:
        • 不可变数据类型内存地址共用,可变数据类型新开辟了一个空间
  • 相关阅读:
    关于JavaScript文档对象
    关于JavaScript浏览器对象
    关于JavaScript事件与函数
    关于JavaScript基础知识
    关于CSS基础知识
    第七章:Hexadecimal, octal, ASCII, UTF8, Unicode, Runes
    没有 Cgroups,就没有 Docker
    Redis 文件事件
    Python 垃圾回收总结
    Docker Bridge 网络原理
  • 原文地址:https://www.cnblogs.com/richard_A/p/11739093.html
Copyright © 2020-2023  润新知