python 值相同变量名不同,内存地址相同吗

如题所述

== (双=), a == b —— 检测两个变量的字面值是否相同
id(a)/id(b) —— 读取单个变量对象的内存存储地址
is(操作符) a is b —— 检测两个变量存储的对象的内存存储地址是否相同
举例:
1、整形数值的字面值为于0-255之间
①值相同: X=1,Y=1时 —— 用 X == Y 检测这些整形数值的字面值是相同的,都是1,用 id(X) 、 id(y)(调用X或 调用Y),检测也都是指向同一地址11,这个值只占用一个内存地址,并且值相同的情况下,不管有多少个变量来调用这个值,都会指向这个同一值和这个值得内存地址,地址设为11,此时X=Y=1,共同读取内存地址11。
②值不同 :变化为X=1,Y=2 时 ——值不同(1、2)所以变量会分别指向不同值和不同内存地址,此时:X=1仍旧读取地址11,Y=2读取地址22。
③值相同:变化拓展为X=2,Y=2,Y=Z时——则X=Y=Z=2 读取地址为22。
以上三种情况,X、Y、Z都是变量,1和2是值,11和22是内存地址。①和③里不同变量指向同一值并且内存地址也相同的机制称为:内存地址的共享引用。但是这种不同变量引用相同值得到相同内存地址的情况仅限于整形数值的字面值在0-255之间,和部分短字节中。这是因为0-255之间的值的地址已被Python预缓存在内存中,而当整形数值的字面值大于255时,即便不同变量引用相同字面值,但内存的分配的地址也绝对不可能相同。举例如下
2、整形数值的字面值大于255
④值相同:X=500,Y=500时 —— 用 X == Y 检测他们的字面值是相同的500 但是用id(X)、 id(y)或 X is Y检测他们的内存地址时,虽然字面值相同,但字面值500大于255,所以X与Y不共享内存地址,此时X内存地址为55,Y地址为66
⑤值不同 :变化为X=500,Y=600 时 —— 字面值不同且500、600都大于255,所以变量会分别指向不同内存地址,此时:X值=500已在④中声明过,所以X地址仍为55,Y因改变值则重新新建地址为77。
⑥值相同:再变化为x=600,y=600,y=z时——则x=y=z=600
用x == y ==z 检测他们字面值相同都是600 ,但因字面值600大于255,所以x与y与z不共享内存地址。用id(x)、 id(y)、 id(z)检测他们的内存地址也都不相同。此时:Y值=600已在⑤中声明过,所以此地址不变Y地址仍为77,X因改变值则重新建地址为88、z新建内存地址99。(并且由于Python的垃圾回收机制,每一个释放过的对象地址都可以被再次进行使用。所以⑥里X的地址也可以是之前④里Y已释放的的地址66,⑥里Z也可以使用X之前的内存地址55或Y之前使用的66)变量不存储值,而是绑定到值。当一个对象没有被绑定到任何一个变量时,它会在合适的时候被销毁,所占用的内存空间也会被回收。所以当一个新的对象被创建时,完全有可能分配到曾经回收的内存。简单可理解为对象地址是:先声明先占有,释放则回收。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-15
如果是常用的值,可能会为了优化内存使用存储在同一位置,但是使用中和不同值的变量无区别

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网