• 深浅copy与小数据池


    is == id 用法

    is # 判断两个内存地址是否相同     
    == # 判断等号两边的值是否相同     
    = 代表赋值 改变指向
    

    代码块

    在python中一个模块,一个函数,一个类,一个文件等都是一个代码块。
    

    同一代码块

    机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
    适用对象: int(float),str,bool。
    

    不同代码块(小数据池)

    1.先执行代码块,不符合代码块才会执行小数据
    2.代码块:  一个文件,一个模块,一个函数,一个类,终端中每一行都一个代码块
    3.小数据池就是Python中一种提高效率的方式,固定数据类型使用同一个内存地址
    
    小数据池讲解 不同代码块的
    int 驻留
    	-5 ~ 256  *记住
    字符串 驻留
        1.字符串在做乘法的时候总长度不能超过20,进行驻留   # 记住
        2.自己定义的字符串 长度不限制 字符串必须(字母,数字.下划线)组成,进行驻留
        3.特殊字符(中文除外)定义1个时候,进行驻留
        4.字符串*1 其实就是赋值
    bool值就是True,False
    
    怎么能自己驻留?
    需要使用python的内置模块 from sys import intern
    # a = intern("@@@@@@"*20)
    # b = intern("@@@@@@"*20)
    # print(a is b)        # 自己进行驻留
    

    深浅copy

    # 浅copy: list dict: 嵌套的可变的数据类型是同一个。
    浅拷贝:拷贝目标可变对象(list, dict, set)时,仅为 整体 第一层可变对象分配新的内存地址,第二层(元素)及以上的可变对象沿用之前对象的内存地址,此外**所有层的不可变对象(int, str, bool, tuple)均沿用之前对象的内存地址。
    
    # 深copy: list dict: 嵌套的可变的数据类型不是同一个 。
    深拷贝:拷贝目标可变对象(list, dict, set)时,为所有层的可变对象分配新的内存地址,此外所有层的不可变对象(int, str, bool, tuple)均**沿用之前对象的内存地址。
    
    深浅拷贝的规律:
    赋值: 两个变量使用的是同一个空间
    浅拷贝:修改不可变数据类型,不变动,修改可变数据类型,变动
    深拷贝:修改就不变动
    赋值运算 =  不是copy 只是改变指向  ID相同
    
  • 相关阅读:
    自己改了个{svn服务器端绿色版}
    Android去掉顶部的阴影
    SqliteOpenHelper的onUpgrade()死活不运行的解法
    前端模拟发送数据/调试的好工具:Chrome下的PostmanREST Client
    mouseenter & mouseleave VS mouseover & mouseout
    Android WindowManager$BadTokenException异常应对案例
    Eclipse快捷键大全(转载)
    360桌面JSAPI一个诡异的bug:客户端与网页通过js通信
    《你在哪》1.34强势发布,新增“图片墙”
    经过一个月的奋斗,我的第一个Android作品《麦芒》诞生了
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12386093.html
Copyright © 2020-2023  润新知