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 和 == 的区别

  1. is:对内存地址进行比较

    v1 = 123
    v2 = v1
    print(v1 is v2) # True
    v1 = 321
    print(v1 is v2) # False
  2. ==:对两边的值进行比较

    v1 = 6
    v2 = 6
    print(v1 == v2) # True

Python内存相关的更多相关文章

  1. python内存相关问题

    想要弄清楚内存相关的问题,就要理清楚:变量.内存地址.值之间的关系:1.程序里什么时候分配新的内存地址?答:1.定义一个变量,内存就开辟一个内存空间,分配一个内存地址. 特殊: 如:a=687 a=1 ...

  2. python内存相关以及深浅拷贝讲解

    3.9 内存相关 3.9.1 id,查看内存地址 >>> v1 = [11,22,33] >>> v2 = [11,22,33] >>> prin ...

  3. python 内存问题(glibc库的malloc相关)

    题记: 这是工作以来困扰我最久的问题.python 进程内存占用问题. 经过长时间断断续续的研究,终于有了一些结果. 项目(IM服务器)中是以C做底层驱动python代码,主要是用C完成 网络交互部分 ...

  4. Python内存优化

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  5. Python内存优化:Profile,slots,compact dict

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  6. python文件相关操作

    Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...

  7. 记一次调试python内存泄露的问题

    转载:http://www.jianshu.com/p/2d06a1a01cc3 这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-de ...

  8. Python内存分配器(如何产生一个对象的过程)

    目录 内存分配器 Python分配器分层 第零层--通用的基础分配器 第一层--低级内存分配器 内存结构 arena pool new arena usable_arenas和unused_arena ...

  9. 【python测试开发栈】—python内存管理机制(二)—垃圾回收

    在上一篇文章中(python 内存管理机制-引用计数)中,我们介绍了python内存管理机制中的引用计数,python正是通过它来有效的管理内存.今天来介绍python的垃圾回收,其主要策略是引用计数 ...

随机推荐

  1. TypeError: Data location must be "memory" for return parameter in function, but none was given.

      在用truffle编译智能合约时,报错 TypeError: Data location must be "memory" for return parameter in fu ...

  2. JNI调用C和C++存在的区别

    JNI调用C和C++存在的区别   JNI是由C语言定义接口的,JNI通过函数名找函数入口,执行函数里的内容.这和函数用什么语言生成的并没有关系.只要保证函数名称符合JNI的协议.而使用C++要注意的 ...

  3. LeetCode 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  4. osgViewer应用基础

    #ifdef _WIN32#include <windows.h>#endif#include <osgViewer/Viewer>#include <osgDB/Rea ...

  5. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_08-新增页面-前端-Api调用

    表单数据提交到后台 export const page_add = paramas => { return http.requestPost(apiUrl+'/cms/page/add',par ...

  6. CentOS下Hadoop及ZooKeeper环境搭建

    1. 测试环境 操作系统 CentOS 6.5. 总共5台机器,前两台作为namenode,称之为 nn01.nn02:后三台作为datanode,称为 dn01.dn02.dn03. 每台机器的内存 ...

  7. iOS-iOS 支付 [支付宝、银联、微信](转)

    支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId ...

  8. 为什么linux系统中init被systemd替换了

    Linux init 进程是系统初始化进程,比较古老了,所以出现了一些新的替代方案: Upstart – A init replacement daemon implemented in Ubuntu ...

  9. linux 文件赋权限

    chown tomcat:tomcat /logs chmod 766 /logs

  10. 记录一下自己安装Appium的流程

    跟着其他大佬的安装攻略,一步一步来的.过程中遇到了一些问题,也都解决了~ 需要准备的东西: 1.JDK1.8 2.Andriod SDK 3.Node.js 4.Python 5.Appium-pyt ...