python基础4(小数据池,编码,深浅拷贝)

Posted Walt Hwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础4(小数据池,编码,深浅拷贝)相关的知识,希望对你有一定的参考价值。

1、==与is

  • == 比较值是否相等
  • is比较内存地址是否相同

 

2、小数据池

  • 为了节省内存,当数据在一个范围里的时候,两个值相同的变量指向的是小数据池里的同一个地址
  • 数字范围:-5 ~ 256
  • num1 = 3
    num2 = 3
    i1 = id(num1)
    i2 = id(num2)
    #此时i1==i2

     

3、编码

  • ascii:     8位       1字节     表示一个字符
  • unicode:  32位     4字节     表示一个字符
  • utf-8
    • 英文    8位    1字节
    • 欧洲    16位  2字节
    • 亚洲    24位  3字节
  • gbk
    • 英文   8位    1字节
    • 中文   16位  2字节
  • 各个编码之间的二进制,是不能互相识别的,会产生乱码
  • 文件的传输,存储不能是unicode(只能是utf-8、utf-16、gbk、gb2312、ascii等)
  • python3中str是使用unicode编码的
  •  

 4、深浅拷贝

  • 原因:共享内存导致的结果
  • 如果通过赋值,使两个变量指向同一个内存地址(可变数据类型),则修改其中的一个,另一个也会跟着修改。如果是不可变数据类型(如字符串),修改一个另一个不会变
    li1 = [1,2,3]
    li2 = li1
    
    li2[0] = 2
    print(li)    # -> [2,2,3]
  • 浅拷贝:数据半共享,复制的数据独立存放在其他内存中,但是只复制第一层。如果是列表等可变数据类型,拷贝的是内存地址,所以修改这类元素,还是会全都改变
    li1 = [1,2,3,[4,5]]
    
    li2 = li1.copy()
    
    #修改第一层
    li2[0] = 3    #此时:li2 = [3,2,3,[4,5]]
                      #但li1未更改:li1 = [1,2,3,[4,5]]
    
    #修改其中的列表
    li2[3][1] = 9    #此时:li2 = [3,2,3,[4,9]]
                          #li1对应元素修改:li1 = [1,2,3,[4,9]]

    从内存来看:

  • 深拷贝:数据完全不共享,复制的数据完全独立放到另一个内存中,包括可变数据类型的内容
    import copy    #使用深拷贝需要导入copy
    li1 = [1,2,3,[4,5]]
    
    li2 = copy.deepcopy(li1)    #深拷贝
    
    #此时修改li2的所有元素,li1都不会改变
    li2[3][0] = 777    #li1仍是[1,2,3,[4,5]]

     

 

以上是关于python基础4(小数据池,编码,深浅拷贝)的主要内容,如果未能解决你的问题,请参考以下文章

python编码以及深浅拷贝

python之深浅拷贝(基础四)

Python基础篇-深浅拷贝小数据池集合

python 深浅拷贝,集合 ,小数据池 操作

python入门小数据池深浅拷贝集合

python入门小数据池深浅拷贝集合