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的垃圾回收,其主要策略是引用计数 ...
随机推荐
- 爬虫之python3用execjs执行JS代码
JS运行环境 Node.js 是Javascript语言服务器端运行环境 安装和配置:https://www.runoob.com/nodejs/nodejs-install-setup.html 测 ...
- 微信小程序之简单记账本开发记录(一)
下载并安装微信开发者工具 在选择开发记账本程序的时候犹豫着选择android studio还是微信小程序 最后选择了微信小程序,因其便利和快捷. 话不多说,第一步,下载并安装微信开发者工具.下面是教程 ...
- vue-导入element-ui
安装 npm install element-ui -S 项目中导入 修改main.js import ElementUI from 'element-ui'; import 'element-ui/ ...
- easyui复选框实现单选框
$(':checkbox[name=primary_key_flag]').each(function(){ $(this).click(function(){ if(this.checked){ $ ...
- oracle中查询某个库中所有的表以及所占的表空间大小
1. 查某一用户下的表select SEGMENT_NAME,TABLESPACE_NAME,sum(BYTES/1024/1024)||'M' from USER_extents where SEG ...
- 如何把Java的double类型变量保留两位小数
已知 双精度标量 f, 如果想以字符串形式输出,小数点后保留2位,可直接通过C语言的输出格式,System.out.printf("%.2f", f), 达到目的. 如果想要先转 ...
- arcgis python 标注
import arcpy mxd = arcpy.mapping.MapDocument("current") lyr = arcpy.mapping.ListLayers(mxd ...
- centos7 - nginx配置安装phpmyadmin
原文 https://www.linuxidc.com/Linux/2017-10/147556.htm 使用Nginx搭建phpMyAdmin Nginx有什么用? Nginx可读作Engin ...
- 性能分析 | 线上CPU100%排查
不知道在大家面试中,有没有遇到这个问题: 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答! 高调版 对不起,我是做研发的,这个问题在 ...
- Mapper抽象类参数
Mapper< Object, Text, Text, IntWritable> Mapper< Text, Text, Text, Text> Mapper< Text ...