python小数据池、代码块、深浅拷贝与集合

我的梦境 提交于 2020-02-04 00:31:31

小数据池代码块、深浅拷贝与集合

小数据池和代码块

== id is

a = 10
b = 10
print(a == b) 

a = "alex"
b = "alex"
print(a == b)
name = "alex"
print(id(name))  
# 4327876736
a = 10
b = 10
print(id(a))  # 4304849568
print(id(b))  # 4304849568
print(a is b)  # True
# 获取的结果是True是因为a和b的内存地址是相同的

代码块简介:

代码块:Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。

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

小数据池:小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等

代码块的缓存机制

前提条件:在同一个代码块内。

机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。

换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新

的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例

子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,

即:id相同。

适用对象: int(float),str,bool。

代码块支持:

  • 字符串:
    • 定义字符串的时候内容,长度任意内存地址相同。
    • 字符串进行乘法的时候总长度 <=20 内存地址相同。
    • 中文,特舒符号 乘法的时候只能乘以1或 0
  • 数字:
    • 相同的数字内存地址相同
  • 布尔值:
    • 相同的内存地址相同

小数据池

​ Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的

缓存对象。python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创

建对象, 而是使用在字符串驻留池中创建好的对象。其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就

是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的

整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

​ 小数据池的支持数据类型和范围:

小数据支持:

  • 字符串:
    • 纯字母和数字的时候长度任意,内存地址相同。
    • 纯字母和数字乘法总长度 <= 20 内存地址相同。
    • 中文和特殊符号乘法的时候只能乘以 0 内存地址相同
  • 数字:
    • -5 ~ 256
  • 布尔值:
    • True
    • False

当代码块和小数据池两个在一起,先执行代码块

深浅拷贝

赋值

赋值,即为数据存储地址添加标签

lst = [1,2,3,[6,7,8]]
lst1 = lst
lst.append(9)
print(id(lst))
print(id(lst1))
print(lst is lst1)
#结果:
2608490166408
2608490166408
True

浅拷贝

浅拷贝就是只拷贝第一层的元素

lst = [1,2,3,[6,7,8]]
# lst2 = lst[:] # 浅拷贝
lst2 = lst.copy()
lst.append(9)
print(lst)
print(lst2)
#结果:
[1, 2, 3, [6, 7, 8], 9]
[1, 2, 3, [6, 7, 8]]

lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[1] = "22"
print(lst)
print(lst2)
#结果:
[1, '22', 3, [6, 7, 8]]
[1, 2, 3, [6, 7, 8]]

lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[-1].append(9)
print(lst)
print(lst2)
#结果:
[1, 2, 3, [6, 7, 8, 9]]
[1, 2, 3, [6, 7, 8, 9]]

深拷贝

深拷贝:拷贝过程中遇到可变数据类型重新创建内存地址,直接拷贝最内层元素

import copy
lst = [1,2,3,[6,7,8]]
lst1 = copy.deepcopy(lst)
lst[-1].append(9)
print(lst)
print(lst1)
#结果:
[1, 2, 3, [6, 7, 8, 9]]
[1, 2, 3, [6, 7, 8]]

赋值、深浅拷贝总结

  • 赋值操作本质上是为数据对象添加标签,进行操作后,标记同一内存地址的变量的值均发生改变
  • 浅拷贝即为拷贝第一层元素,对外层元素进行操作后,拷贝前后变量的值不相同,对内层元素进行操作后,拷贝前后变量的值均发生改变
  • 深拷贝直接拷贝最内存元素,对内外层元素进行操作时,拷贝前后变量的值都不相同

集合(set)

集合:可简单理解为没有值的字典

特性:天生去重

集合操作:

  • 增加元素

    .add(元素)

    .update(元素)

  • 删除元素

    .pop() 随机删除

    .remove(元素) 指定元素删除

    .clear() 清空集合 空集合set()

  • 修改

    先删除后添加

  • 查找

    set1 = {'alex',1,False}
    for i in set1:
        print(i)
  • 其他操作:

    & 交集 |并集 ^反交集 -差集 >超集 <子集

    frozenset() 冻结集合

    将可变数据类型变为不可变数据类型

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!