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 --

python中id函数的用法_用id函数做几个测试相关推荐

  1. python中for循环的用法_浅谈Python的for循环

    for循环在python中的重要性毋庸置疑,可是,我们真的把所有for循环的知识点都理解透了么?试试看以下内容: for 循环的基本格式 for iterable是可迭代对象,包括字符串,列表,元组, ...

  2. filter函数的用法_动态数组函数系列5| 筛选函数FILTER,单条件多条件动态筛选

    FILTER函数是筛选函数,就是在源数据中按照我们的条件筛选出我们想要的数据.除了常规的数据筛选,还可以进行多条件的"且"或者"或"的筛选. 下面我们来看看这个 ...

  3. python中try...except的用法_提高开发效率,从避免滥用 try...except... 开始

    有不少人在写 Python 代码时,喜欢用 try...except... 一把梭,更有甚者一层套一层,不管有没有用,先套了再说: def func(): try: "函数内部代码" ...

  4. python中while语句的用法_全面解析Python的While循环语句的使用方法

    Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...

  5. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  6. python中shutil.copyfile的用法_用Python复制文件的9个方法

    Python 中有许多"开盖即食"的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作.在这篇文章中,你将会看到一些用 Python 实现文件复制的 ...

  7. python中叹号的用法_感叹号

    感叹号: 感叹号,为标点符号的一种,又称惊叹号.叹号,用于句子结尾,表示惊讶.主要用在感叹句的句末,表示强烈的感情.感叹句是以抒发感情为主的句子,它所表示的感情有赞颂.喜悦.愤怒.叹息.惊讶,伤悼等. ...

  8. python中if else语句用法_讲解Python中if语句的嵌套用法

    可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...

  9. python中while true的用法_解析Python中while true的使用

    无限循环 如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例: #!/usr/bin/python # -*- coding: UTF-8 -*- var = 1 while var ...

最新文章

  1. python培训好学吗-Python0基础好学吗?
  2. HTTP协议常用标准状态码含义
  3. 【⭐C++宝藏男孩⭐】C++ string字符串比较
  4. vue单文件props写法_vue开发中怎么按需加载需要被填入props和自定义事件的组件?...
  5. 12-基于selenium实现12306模拟登录,及京东登录滑动缺口验证模拟登录
  6. 微信小程序自定义弹窗实例
  7. vim 高亮显示php代码
  8. 新手学appium-Appium for Windows说明(中文翻译)
  9. 总结一下数据库的 一对多、多对一、一对一、多对多 关系
  10. 面试归来,感觉无望,下次再战
  11. LTE 注网流程log分析
  12. Typora自动上传图片
  13. 为什么int类型(16位)的下溢下限为-32768而上溢上限却是32767
  14. 基于ESP32测温湿度上传到OneNET并通过微信小程序控制,查看,下发指令
  15. 明源售楼系统技术解析—MVC架构
  16. recover-quack-data-structure
  17. DWG文件如何转换为PDF黑白文件
  18. 备用手机如何自动转发短信和验证码
  19. Spring入门实例
  20. 计算机机房监控系统上海,上海机房监控-上海机房环境监控系统

热门文章

  1. cad中tk什么意思_设计中的“Neobject”什么意思?来了解一下
  2. vs生成linux服务器程序,从Visual Studio到Linux上调试C++代码
  3. 更换mysql_这些被你忽视的MySQL细节,可能会让你丢饭碗!
  4. shell中返回值是1为真还是假_shell脚本中判断上一个命令是否执行成功
  5. 一文汇总 JDK 5 到 JDK 15 中的牛逼功能!
  6. Java中竟有18种队列?45张图!安排
  7. 程序员专属精美简历合集—第二弹
  8. ReactNative常用组件汇总
  9. 表单reset无法重置hidden的解决方案
  10. CentOS7 源码编译安装Python3 shell脚本