Python内存相关
Python内存相关
示例一:
v1 = [1, 2, 3]
v2 = [1, 2 ,3]
v1 = 123
v2 = 123
v1 = "dogfa"
v2 = "dogfa"
# 虽然v1 和v2 的值相同,但是由于v1和v2 在内存中分别开辟了两块不同的空间,所以理论上v1的内存地址不等于v2的内存地址 (在Python中有不同变化,下面会介绍)
示例二:
v1 = [1, 2, 3]
v1 = [4, 5, 6]
# v1最开始指向的内存地址是[1, 2, 3],但是由于对v1进行了重新赋值,所以v1重新指向了内存地址中的[4, 5, 6],这个时候原来v1 指向的内存地址中的[1, 2, 3]由于没有变量接收,将会被Python中的GC(垃圾回收机制)释放掉。
示例三:
v1 = [1, 2, 3]
v2 = v1
v2.append(4)
print(v1) # [1, 2, 3, 4]
print(v2) # [1, 2, 3, 4]
# v1 的内存地址指向了[1, 2, 3],v2 = v1 表示将v1 的内存地址赋值给了v2, 也就意味着v2的内存地址也指向着[1, 2, 3],无论对v1 中的元素还是对v2 中的元素进行改变,都将互相影响。
v1 = [1, 2, 3]
v2 = v1
v1 = 123
print(v1) # 123
print(v2) # [1, 2, 3]
# 首先v1 和v2 指向了同一个内存地址,但是后来对v1 进行了重新赋值,v1所指向的内存地址发生了改变,而v2所指向的内存地址并没有发生改变,还是原先v1 所指向的内存地址,所以print(v1)将输出 “123”, print(v2)将输出[1, 2, 3]
v1 = "dogfa"
v2 = v1
v1 = "oldniu"
print(v1) # oldniu
print(v2) # dogfa
示例四:
v = [1, 2, 3]
lst = [11, 22, v]
v.append(4)
print(v) # [1, 2, 3, 4]
print(lst) # [11, 22, [1, 2, 3, 4]]
# lst 中的v 实际上存放的是指向的内存地址
v = [1, 2, 3]
lst = [11, 22, v]
lst[2].append(4)
print(v) # [1, 2, 3, 4]
print(lst) # [11, 22, [1, 2, 3, 4]]
v = [1, 2, 3]
lst = [11, 22, v]
v = 4
print(v) # 4
print(lst) # [11, 22, [1, 2, 3]]
# v 的内存地址发生了改变,而lst中的v指向并没有发生改变
v = [1, 2, 3]
lst = [11, 22, v]
lst[2] = 33
print(v) # [1, 2, 3]
print(lst) # [11, 22, 33]
结论:当变量属于不可变类型时(str,int,tuple),对其重新赋值,将会开辟新的内存空间。当变量属于可变类型时(list,dict,set),对其内部的元素进行操作时,将不会重新开辟内存空间,对整个变量进行赋值时,将会开辟新的内存空间。
小数据池
v1 = 123
v2 = 123
print("int:", id(v1))
print(id(v2))
v1 = "dogfa"
v2 = "dogfa"
print("str:", id(v1))
print(id(v2))
理论上v1和v2的内存地址是不一样的,但是结果是否真的如此吗?以下是打印输出结果。
从打印结果我们 可以看出内存地址是完全一致的,那么是否意味着我们之前所认为的全都是错误的?其实并不是的。
因为在Python当中有一个小数据池,你可以理解为是一个容器,里面存放了int类型和str类型的数据的存储规则。
1、int类型的规则:它会把 -5 ~ 256 范围内的数进行缓存,当你将这些整数赋值给变量时,它不会再次开辟新的内存空间,而是使用已经创建好的缓存对象。
2、str类型的规则:① 出现特殊字符时,内存地址不相等
② 当字符超过20个以上时,内存地址不会相等
is 和 == 的区别
is:对内存地址进行比较
v1 = 123
v2 = v1
print(v1 is v2) # True
v1 = 321
print(v1 is v2) # False
==:对两边的值进行比较
v1 = 6
v2 = 6
print(v1 == v2) # True
Python内存相关的更多相关文章
- python内存相关问题
想要弄清楚内存相关的问题,就要理清楚:变量.内存地址.值之间的关系:1.程序里什么时候分配新的内存地址?答:1.定义一个变量,内存就开辟一个内存空间,分配一个内存地址. 特殊: 如:a=687 a=1 ...
- python内存相关以及深浅拷贝讲解
3.9 内存相关 3.9.1 id,查看内存地址 >>> v1 = [11,22,33] >>> v2 = [11,22,33] >>> prin ...
- python 内存问题(glibc库的malloc相关)
题记: 这是工作以来困扰我最久的问题.python 进程内存占用问题. 经过长时间断断续续的研究,终于有了一些结果. 项目(IM服务器)中是以C做底层驱动python代码,主要是用C完成 网络交互部分 ...
- Python内存优化
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- Python内存优化:Profile,slots,compact dict
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- python文件相关操作
Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...
- 记一次调试python内存泄露的问题
转载:http://www.jianshu.com/p/2d06a1a01cc3 这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-de ...
- Python内存分配器(如何产生一个对象的过程)
目录 内存分配器 Python分配器分层 第零层--通用的基础分配器 第一层--低级内存分配器 内存结构 arena pool new arena usable_arenas和unused_arena ...
- 【python测试开发栈】—python内存管理机制(二)—垃圾回收
在上一篇文章中(python 内存管理机制-引用计数)中,我们介绍了python内存管理机制中的引用计数,python正是通过它来有效的管理内存.今天来介绍python的垃圾回收,其主要策略是引用计数 ...
随机推荐
- OpenJudge1.5.6:整数序列的元素最大跨度值
描述 给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值). 输入一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不 ...
- UVALive 3716 DNA Regions ——(扫描法)
乍一看这个问题似乎是很复杂,但其实很好解决. 先处理出每个点到原点的距离和到x正半轴的角度(从x正半轴逆时针旋转的角度).然后以后者进行排序. 枚举每一个点到圆心的距离,作为半径,并找出其他到圆心距离 ...
- Ubuntu18.04 桌面系统的个人吐槽(主要是终端)
装了Ubuntu18.04,桌面换风格了,使用中最大的感觉是终端切换非常反人类,可能是我还没有摸清门路.原先习惯用Alt+Tab快捷键切不同终端以及不同窗口的,现在Alt+Tab时多个终端会归成一个图 ...
- java中json的使用和解析
1.创建json对象 1.1 创建JSONObject对象 使用map初始化json @Test public void test1() { Map<String, Object> map ...
- MySQL的那些坑
1. 表名一定要区分大小写,不一致就会报错 2. 无隐式的类型转换 (比如对某数值进行排序时,原表字段存储却是varchar型,就会对该数值按字符串排序而非数值大小!) 3. group by 也能 ...
- Servlet的概述
A: Servlet的概述: server applet , 是一个运行在服务器端的小应用程序 B: 就是一个接口,作用: servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web ...
- android ONVIF 组播探测在线摄像机
http://blog.csdn.net/ghostyu/article/details/8182516 Android的Wifi,默认情况下是不接受组播的,见:http://developer.an ...
- Swagger下载的zip文件无法打开,而且大小比直接下载的要大
以前写的一个rest提供的是浏览器下载zip包的功能,前端界面调用rest可以正常地下载. 今天使用Swagger来调试下载功能时,发现下载的zip包打不开,而且大小也比直接在浏览器中输入rest地址 ...
- lnmp搭建-手动版
参照链接:http://blog.csdn.net/bravemelon/article/details/64925499 centOS 下安装 Nginx yum -y groupinstall & ...
- 慎用rm -rf
首先,搞个回收站在~下 .bashrc或者.bash_profile加入 mkdir -p ~/.trash alias rm=trash alias r=trash alias rl='ls ~/. ...