恶魔的微笑111

导航

python之小数据池和深浅拷贝

小数据池

小数据池支持的数据类型:int、str、bool(整型、字符串、布尔值)
代码块:一个函数,一个py文件,终端的每一行都是代码块
== 和 is的区别(id()查看内存地址)

​ == 是比较两端的值是否相等
​ is是比较两端的内存地址是否相等
​ print(id(a),id(b))查内存地址

  • 小数据池中

    • int:-5~256
    • str:
      1. 字母数字长度任意符合驻留机制
        ​ 2. 字符串进行乘法的时候,总长度不能超过20位
        ​ 3. 特殊符号进行乘法的时候只能乘零
  • 代码块中:

    • int:-5~正无穷
    • str:
      1. 定义字符串的时候可以是任意的
        ​ 2. 字符串(字母,数字)进行乘法是总长度不能超过20
        ​ 3. 特殊符号(中文,符号)进行乘法的时候只能乘以0或1

驻留机制:节省空间,提高效率(减少了开辟空间和销毁空间的耗时间
小数据池和代码块同时存在时,先执行代码块

深浅拷贝

  • 浅拷贝:只拷贝第一层元素的地址,只有修改第一层(不可变类型)的时候原数据不受影响,给可变数量类型添加的时候原数量会受影响
  • 深拷贝:不可变数据类型共用,可变数据类型新开辟一个空间
数字和字符串
import copy

############# 数字和字符串 ##############
n1 = 123
n2 = 'mjc'
n1_1 = n1 # 赋值
n2_2 = n2 # 赋值
print(id(n1), id(n1_1))
>>4355288240 4355288240
print(id(n2), id(n2_2))
>>4358346040 4358346040
n1_c = copy.copy(n1) # 浅拷贝
n2_c = copy.copy(n2) # 浅拷贝
print(id(n1), id(n1_c), id(n2), id(n2_c))
>>4355288240 4355288240 4358346040 4358346040
n1_d = copy.deepcopy(n1) # 深拷贝
n2_d = copy.deepcopy(n2) # 深拷贝
print(id(n1_d), id(n1), id(n2_d), id(n2))
>>4355288240 4355288240 4358346040 4358346040

​ 对于字符串和数字,元组等不可变数据类型,赋值和深浅拷贝毫无意义,因为同时指向的是同一个内存地址

其他数据类型

​ 对于字典、列表其他可变数据类型进行赋值、深拷贝 和浅拷贝时,内存地址是不同的

  1. 赋值
    赋值只是创建一个变量,该变量指向原来的内存地址
  2. 浅拷贝
    在内存中只额外创建第一层数据
  3. 深拷贝
    在内存中将所有的数据重新创建一份

posted on 2020-02-25 21:33  恶魔的微笑111  阅读(104)  评论(0编辑  收藏  举报