python中id函数的用法_用id函数做几个测试

Python内置的id函数其实非常简单,就是将参数对象的内存地址返回,即id函数返回的是一个很大的整数(地址)。基于Python语言的特性,本文做了几个测试,还比较有趣。

相同整数的id相同

>>> a = 6

>>> b = 6

>>> id(a)

94061989787808

>>> id(b)

94061989787808

>>> a == b

True

>>> a is b

True

a和b是两个变量,但是按照上面代码的显示,a和b不仅内容相同,地址也相同,a就是b。(==和is的区别)

这是Python为了高效利用内存而采取的一种机制,a和b都是对一个内存中对象的引用,赋值(=)实际上是创建一个对象,将地址给引用变量。既然a和b指向的对象都是6这个整数,Python就没有“动力”去创建多个对象了。有人会问,如果修改变来领的值,比如修改a的值为7,b的值会跟着变吗?答案是不会。看下面的代码:

>>> a = 7

>>> a

7

>>> b

6

>>> id(a)

94061989787840

>>> id(b)

94061989787808

>>> a == b

False

>>> a is b

False

当 a=7 时,Python实际上是创建了一个新的值为7的整数对象,让a引用,同时保持6这个整数对象不变,这时,a和b的指向地址就不再相同了。

这是Python跟C很不一样的一个地方。在Python中,一切都是对象,所有变量都是对某个对象的应用(有点像指针),内存管理自动进行(某个对象的引用数为0的时候,自动清理这部分内存)。在C中,一切都是内存和指针,C编码在某种意义上是面向内存的编码,任何变量以及函数的返回值,都要明确定义类型,类型就是占用内存的大小。

相同整数的id不同

>>> i1 = 666666

>>> i2 = 666666

>>> i1 == i2

True

>>> i1 is i2

False

>>> id(i1)

140693768352752

>>> id(i2)

140693768353040

如果两个整数值比较大,id就不一样了。我也不明白为什么?数值小,id一样,数值大,id不一样。

相同浮点数的id不同

貌似浮点数,id总是不同的,这应该与浮点数的比较有关系(不能直接用==来比较浮点数)。

>>> f1 = 1.23

>>> f2 = 1.23

>>> f1 is f2

False

>>> f1 == f2 # not right to compare like this

True

>>> id(f1)

140693769437496

>>> id(f2)

140693769437304

返回函数局部变量

如上文所述,Python中所有的变量都是像C语言的指针一样,是一个指向对象的引用,Python在返回函数的局部变量的时候,返回的也是这个局部变量的引用地址。

>>> def test():

... a = 12345

... print(id(a))

... return a

...

>>> b = test()

140693768353008 # id(a) in test()

>>> id(b)

140693768353008

test函数执行完毕后,将a的内存地址返回给了b。

这一个细节在一开始,还困扰了我一小会儿。函数的局部变量的地址处于调用栈内,在函数执行完成后,调用栈就会被弹出,局部变量的地址就失效了,不能在引用了。为什么Python不是这样呢?

Python确实没有为b重新创建一个新的对象,a对象对应的地址被传给了b,但是a这个变量也随着test函数执行完毕而消失了(a被弹出了调用栈,而不是a指向的内存对象被弹出,这段内存可理解在heap中)。Python中的变量,像指针,但却不是指针,只是对象的引用。a的有效范围在test函数内,test函数执行完后,a就不复存在,b获取了test函数的“返回值”,我们没有必要纠结b的内存地址是否与局部变量a一样。Python自己管理内存,我们编程者不需要太关心。a不能再使用了,但是a指向的内存对象还可以继续被使用,这并没有违背函数调用栈的逻辑(a本身被弹出栈,a指向的内存对象还在别的地方存在着,只要还有引用)。

Python内置的id函数一般情况下,没有什么用于,主要用于调试等场景。

-- EOF --

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式文件系统对比与选型参考

一、分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户…

为什么python工程师掌握这些就够了_Python工程师薪资飙升,Python这些技能你掌握了吗...

Python的火热,也带动了工程师们的就业热。那么,Python的市场需求和工程师待遇到底如何呢?今天我们来看看具体数据。2019年招聘python工程师薪资飙升,Python这些技能你掌握了吗?Python岗位和待遇和要求怎么样?下面从招…

linux安装ld编译器,科学网—手动安装特定版本的gcc编译器 - 亓欣波的博文

Linux发行版中一般预装了gcc编译器,版本随系统不同而不同,有时候不想用(或者是不能用)系统默认的gcc编译器,就需要自己编译特定版本的gcc编译器。这里以在Ubuntu14.04环境(默认gcc为4.8.2)安装gcc4.6.3为例,记录一下安装过程。整个…

canvas js 绘图插件_Canvas专题—绘制柱状图(2)

目标:在我们了解过前两章节的知识点以后,为了把知识点进行连结,拓展,现在我们做一个图表吧。看一个echartst图表当今Canvas库有很多供我们选择,比如,echarts在很大程度上能够提高我们的工作效率&#xff0c…

界面优美的linux,Ubuntu 11.04新版发布 诠释精美用户界面

主要改进内容如下:Unity界面在Alpha 3中进行了重大改进,重新设计了Dash面板的功能,可以按类别显示应用程序,此外还包括更好的搜索过滤、支持全屏以及其他视觉效果的提升。Ubuntu 11.04 Alpha 3升级了安装程序,用户如今…

springboot 使用 minio

springboot 使用 minio yml 配置 yml 配置 # ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ minio:url: http://114.67.110.190:9001accessKey: minioadminsecretKey: minioadminbucketName: zpfmaven: <dependency><groupId>io.minio</groupId><artifa…

pythonsql注入步骤_防止SQL注入解决方案

SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。对于很多网站都有用户提交表单的端口&#xff0c;提交的数据插入MySQL数据库中&#xff0c;就有可能发生SQL注入安全问题&#xff0c;那么&#…

立创EDA

绘制PCB流程&#xff1a; 画原理图 ——> 画原理图 ——> 布线 ——> 铺铜 器件&#xff1a; 器件就是一个个不同的元件&#xff0c;每个元件不同的引脚有不同的功能&#xff0c;但有可能封装是一样的&#xff0c;所以将器件和封装练习起来&#xff0c;才能将…

linux和信息资源管理,Linux top命令详解

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法和各参数的含义。在终端敲入 top后&#xff0c;会显示如下类似的信息&#xff1a;Top - 01:06:48 up 1:22, 1 use…

python中sorted函数的用法_Python3 中sorted() 函数的用法

描述 sorted() 函数对所有可迭代的对象进行排序操作。 语法 sorted(iterable, keyNone, reverseFalse) iterable – 可迭代对象。 key – 主要是用来进行比较的元素&#xff0c;只有一个参数&#xff0c;具体的函数的参数就是取自于可迭代对象中&#xff0c;指定可迭代对象中的…

springboot整合minio最新版

第一步&#xff1a;查找minio最新依赖&#xff0c;通过maven查询网站查询,这搜索框输入minio&#xff0c; 也可以查看MinIO官网https://docs.min.io/docs/java-client-quickstart-guide.html 如下: 点击minio进入查看maven依赖&#xff0c;可以看到最新版为8.3.4 <dependen…

linux openh264 编译,在Linux下为Android构建openh264

我正在尝试构建openh264以在android上使用-我有来自git的最新openh264源码-我已经ndk 17-我正在使用Ubuntu 16.04跑步make OSandroid NDKROOT/home/r/aff/ndk TARGETandroid-27 NDKLEVEL27 sysroot/home/r/aff/ndk/sysroot我得到了错误&#xff1a;rr:~/aff/openh264$ make OSa…

学生学籍管理系统python_使用Python实现 学生学籍管理系统

大家好&#xff0c;今天跟大家分享一个用Python实现的学生学籍管理系统&#xff1a; 该代码主体由五个函数组成&#xff1a; 1.add_stu() 添加 2.del_stu() 删除 3.print_stu()打印 4.exit_stu() 退出 5.system() 主函数 1.add_stu() 此段函数作用&#xff1a;把输入的值存入字…

Okhttp使用详解

在Android开发中&#xff0c;发送HTTP请求是很常见的。SDK中自带的HttpURLConnection虽然能基本满足需求&#xff0c;但是在使用上有诸多不便&#xff0c;为此&#xff0c;square公司实现了一个HTTP客户端的类库——Okhttp 。 Okhttp是一个支持HTTP 和 HTTP/2 的客户端&#x…

如何开发rest接口服务_如何简化网络请求接口开发

日常开发中&#xff0c;需要大量和后端对接接口&#xff0c;很容易写出大量的模板代码&#xff0c;比如把对接口的请求放到组件内&#xff0c;或者虽然有数据访问层&#xff0c;但是有大量 get&#xff0c;post 方法的调用&#xff0c;传参的字符串拼接&#xff0c;异常处理等等…

OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3

OkHttp协议 okhttp是一个第三方类库&#xff0c;用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 文件下载用Get方式 OkHttpClient okHttpClient new OkHttpClient.Builder().callTimeout…

质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

HT 是啥&#xff1a;Everything you need to create cutting-edge 2D and 3D visualization.这口号是当年心目中的产品方向&#xff0c;接着就朝这个方向慢慢打磨&#xff0c;如今 HT 算是达到了这样的效果&#xff0c;谈不上用尽洪荒之力&#xff0c;但我们对产品结果很满意&a…

linux vi 出现下划线,Vim高亮当前行(显示为下划线)的解决方案

最近配置Vim&#xff0c;由于以前的vimrc早已丢失&#xff0c;只好重新配置一份&#xff0c;此为题外话&#xff0c;略过不提…在Vim中&#xff0c;可以选择开启高亮当前行&#xff0c;这是一个很不错的特性。开启它也很简单&#xff0c;只需要在vimrc中加入这么一行&#xff1…

springBoot 简单优雅是实现文件上传和下载

前言 好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识&#xff0c;后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢&#xff0c;刚好就想起这个脚手架&#xff0c;将文件上传和下载整理进来。 配置 在application.properties 中增…

C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

到现在为止&#xff0c;C 仍然是计算机编程领域的经典语言之一&#xff0c;C 17 标准在2017上半年已经探讨确定。本期我们汇集了编程专家——祁宇(《深入应用 C 11》作者&#xff0c;C 开源社区 purecpp.org 创始人)的多年心得小结&#xff0c;并具体介绍了 C 17 最新标准中值得…