Python基础之小数据池及深浅拷贝

一、小数据池

  • == (等于)
  • == 官方:判断等号两边的内容是否相同

    ? 白话:判断两个人长得是不是一样

  • is

    ? 官方:判断两边的内容是不是一个

    ? 白话:判断这两个人是不是一个人

  • a = 10000
  • b = 10000
  • print(a == b)

    is 是通过内存地址进行判断

    print(id(a),id(b))

    输出结果 ,内存地址一致

  • 代码块:一个py文件,一个函数,一个模块,一个类,交互模式(终端)下的每一行


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

终端中测试的是小数据池缓存机制:

  ? 数字: -5 ~ 256 

  ? 字符串:

  ?             定义时内容(除去中文,特殊符号)长度不限,内容相同,就进行驻留。

  ?          python 3. 6解释器字符串进行乘法时(不能有中文和特殊符号),总长度不能超过20

  ?            python 3. 7解释器字符串进行乘法时(不能有中文和特殊符号),总长度不能超过4096

?

pycharm 中测试的是代码块的缓存机制:

    数字:      -5 ~ 正无穷

  字符串:         

  ?          定义时内容长度不限,内容相同,就进行驻留

  ?         字符串进行乘法时(不能有中文和特殊符号),总长度不能超过20

二、深浅拷贝

赋值操作

lst = [1,2,3]    # 可变数据类型
lst1 = lst
lst.append(4)
print(lst,lst1)      #  lst赋值给了lst1 共用一块内存空间,故lst 添加,lst1也添加
输出结果 [1,2,3,4]  [1,2,3,4]
# 总结:  多个变量指向同一个内存地址,如果这个内存地址的数据是
#       修改时不可变的数据类型时,会新开辟空间(字符串,数字)
#       修改时可变的数据类型时,会在原地进行修改(列表,字典)

浅拷贝

浅拷贝只把原列表中记录的内存地址拿到一个新开辟的列表中为了更好理解,看例子上图!

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

图中橙色的是新开辟的空间,浅蓝色的是数字类型,红色的列表类型


lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[1] = "22"

我们修改成字符串"22" 就是在列表中将以前的内存地址更换成新开辟的空间地址


lst = [1,2,3,[6,7,8]]
lst1 = lst.copy()
lst[-1].append(9)

浅拷贝总结:浅拷贝只开辟最外层空间,其中元素的内存地址都是一样的,就是共用,当不可变数据类型,像int,str,bool这些元素添加或删除或修改的时候都不会互相影响,因为他们需要自行开辟空间,而可变数据类型,修改或添加或删除不需要从新开辟空间,在自己的空间内增删改,所以原拷贝对象变化,拷贝的对象也会变化。

深拷贝

import deepcopy
lst = [1,2,3,[6,7,8,9]]
lst1 = copy.deepcopy(lst)
lst[-1].append(10)

深拷贝:深拷贝不可变元素共用,若各自修改都需自己开辟空间,不会一同改变,假如lst中1需要删除,他的内存地址会删,但是lst2复制的内存地址还是指向1,不会改变,可变数据类型中里面的元素共用,导致各自改变各自的列表内元素,相互不会受到影响,并且列表空间地址不一样,所以各自更改元素受影响的只是自己列表地址空间中的元素而已,不会受到影响!

原文地址:https://www.cnblogs.com/zzsy/p/12216065.html

时间: 2024-10-08 01:49:25

Python基础之小数据池及深浅拷贝的相关文章

小数据池 集合 深浅拷贝

小数据池 集合 深浅拷贝 一.小数据池 定义:小数据池是Python中一种提高效率的方式,固定数据类型使用同一个内存地址,支持数据类型:str,int,bool是一种缓存机制,特被称为驻留机制,各大编程语言中都有类似的东西. id() ----- 查看元素的内存地址 is 与 == 的区别 is 判断两个元素的内存地址是否相等 == 判断等号左右两边的元素的值是否相等 小数据池的规则 数字:-5~256 字符串: 字符串在做乘法(乘数不为1)的时候总长度不能超过20 自己定义的字符串的长度不受限

python基础之小数据池、代码块、编码

一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽然上面的缩进的内容都叫代码块,但是他不是python中严格定义的代码块.python中真正意义的代码块是什么? 块是一个python程序的文本,他是作为一个单元执行的.代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而对于一个文件中的两个函数,也分别是两个不同的代码块: def fu

python基础之小数据池

关于池的概念,大家也许知道 连接池,代理池.然而现在我们提到的小数据池,则是一些Int和string已经创建好的并放在池子里等着我们去调用的对象. '''对于整数,Python官方文档中这么说: The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just

python入门(四)小数据池、深浅拷贝、集合

3.8 小数据池 小数据池:缓存机制(驻留机制) ==(用于判断两边的内容是否相等) a=10 b=10 print(a==b)# ==用于判断两边的内容是否相等 is(用于判断两边内存地址是否相等) a=10 b=10 print(a is b) #输出 True #小数据池总结 #1.数字范围:-5~256 #2.字符串: """ 1.同一代码下,内容相同则内存地址相同 2.乘法相乘总长度不能超过20 3.惩罚的时候中文.特殊符号乘以0 """

小数据池和深浅拷贝

小数据池 一种数据缓存机制,也称驻留机制 在同一代码块,相同的值不会开辟新的内存 特殊字符除外 小数据池只针对:在控制台时! 数字 :-5到256间的整数会被缓存 布尔值:都会缓存8 字符串 小于等于一个字符时会缓存 超过一个字母但是只有下划线,字母,数字组成也会缓存 如果字符串乘法,那小于等于20个就会缓存,超过则开辟新的内存 手动缓存,需要调用工具 from sys import intern a=intern("[email protected]"*5) b=intern(&qu

Python 代码块 小数据池

一  代码块 什么是代码块??? Python程序是由代码块构造的.先举一个例子: 1 for i in '12334567': 2 print(i) 1 def func(): 2 print('Hello,world!') 1 class A: 2 name = 'colin' 从上面的例子可以称为代码块,虽然上面的缩进的内容都叫代码块,但是他们并不是python中严格定义的代码块. 那么,python中真正意义上的代码块又怎么定义? 因此,我们定义:一个模块,一个函数,一个类,一个文件等都

python 浅谈小数据池和编码

?. ?数据池 在说?数据池之前. 我们先看?个概念. 什么是代码块: 根据提示我们从官??档找到了这样的说法: A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definiti

python基础:元组、字典、深浅拷贝与函数

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 元组(tuple) 1. 元组的特点 元组是固定的,不能修改也不能增减.因为元组不可变,所以更安全,如果可以,尽量不使用list而使用tuple 2.  格式 3.  可用参数 4.  元组的结构(以元组a为例) 当创建一个元组a时,将在内存中开辟一个名为a的内存,然后每个索引位置为一个命名空间,每个命名空间都有一个存储,而真实的数据就存在

Python基础滚固(六)深浅拷贝的趣谈

先来探究下浅拷贝 1 a = [1000, [2000, 3000]] 2 b = a.copy() #来个拷贝 3 print(a is b) 4 print(id(a), id(b)) 5 print(id(a[0]) == id(b[0]), id(a[1]) == id(b[1])) #检查第一层每个序列的id是否一致 6 7 #输出结果 8 False #a 与 b 不是同一个 9 4556627912 4557461256 #a b各自id也不一样 10 True True #a b