中投中原建设有限公司网站,公司部门祝福语,安阳市哪里做网站建设,网站文件服务器Python内置的id函数其实非常简单#xff0c;就是将参数对象的内存地址返回#xff0c;即id函数返回的是一个很大的整数#xff08;地址#xff09;。基于Python语言的特性#xff0c;本文做了几个测试#xff0c;还比较有趣。
相同整数的id相同a 6
就是将参数对象的内存地址返回即id函数返回的是一个很大的整数地址。基于Python语言的特性本文做了几个测试还比较有趣。
相同整数的id相同a 6b 6id(a)
94061989787808id(b)
94061989787808a b
Truea is b
True
a和b是两个变量但是按照上面代码的显示a和b不仅内容相同地址也相同a就是b。和is的区别
这是Python为了高效利用内存而采取的一种机制a和b都是对一个内存中对象的引用赋值实际上是创建一个对象将地址给引用变量。既然a和b指向的对象都是6这个整数Python就没有“动力”去创建多个对象了。有人会问如果修改变来领的值比如修改a的值为7b的值会跟着变吗答案是不会。看下面的代码a 7a
7b
6id(a)
94061989787840id(b)
94061989787808a b
Falsea is b
False
当 a7 时Python实际上是创建了一个新的值为7的整数对象让a引用同时保持6这个整数对象不变这时a和b的指向地址就不再相同了。
这是Python跟C很不一样的一个地方。在Python中一切都是对象所有变量都是对某个对象的应用有点像指针内存管理自动进行某个对象的引用数为0的时候自动清理这部分内存。在C中一切都是内存和指针C编码在某种意义上是面向内存的编码任何变量以及函数的返回值都要明确定义类型类型就是占用内存的大小。
相同整数的id不同i1 666666i2 666666i1 i2
Truei1 is i2
Falseid(i1)
140693768352752id(i2)
140693768353040
如果两个整数值比较大id就不一样了。我也不明白为什么数值小id一样数值大id不一样。
相同浮点数的id不同
貌似浮点数id总是不同的这应该与浮点数的比较有关系不能直接用来比较浮点数。f1 1.23f2 1.23f1 is f2
Falsef1 f2 # not right to compare like this
Trueid(f1)
140693769437496id(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 --