python内存分配和编译期的问题

oscar1984 发布于 11/18 20:08
阅读 124
收藏 0

收藏!数据建模最全知识体系解读!>>>

python小白一枚问一个我比较在意的问题。之前在别的地方问过不过没有太满意的回答,希望能解释清楚点谢谢。我在python3.8.2里查看字符串代码是这样子的结果
>>> id('cpccp')
4300388336
>>> id('oee8ed.')
4300388336
但是在3.7里不是这样了
id('cpccp')
4368612352
id('oee8ed')
4370164792
为什么在3.8里面不同的字符串地址一样,而在3.7里面地址会不一样,请问有大神能够帮忙解决吗,好像到处也没人问这个问题的,我就来这里看看。然后好想别的人用同样的版本结果跟我的不一样,有人说跟内存共享和电脑有关但我没听懂
但是好像也有一样的点,如下>>> a='apple'
>>> b='basket'
>>> a+b is 'applebasket'#不管是a+b还是a+'basket'都是false
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
False
>>> id(a+b)
4300389360
>>> id('apple'+b)#输出地址都一样
4300389360
>>> id('apple'+'basket')
4300389360
=================================================
a='apple'#python3.7
b='basket'
a+b is 'applebasket'
False
id(a+b)
4369049264#和下面的地址不一样
id(a+'basket')
4366530480
这个第二个问题跟编译期有关 我在这里看到的https://www.cnblogs.com/greatfish/p/6045088.html
这个第二个问题很多人直接无视了。。。。

加载中
1
前端大师傅
前端大师傅

回答楼主的问题,id取的是当前变量内存地址以数字的形式表示。表示的是当前字面量或变量的内存地址。数字则是其表现形式。相同的字符串使用同一内存地址是完全可能的。用is 操作符可判定两个变量是否指向同一地址。

同一地址两个不同的值先后是正常的,因为字面量是临时的,即你print('123') 这里123没有变量所承载,使用(print)后会立即被回收,下一个print('345')这个345就有可能使用123的地址。

 和版本应该没什么关系。

楼主代码也有点问题。Is操作是比较的内存地址,算术优先级别低于+操作。楼主可以看在下写的事例:

print(id(a+b) == id('apple' + b)) #返回 True

print(a+b is 'apple' + b) #返回 False

 

0
oscar1984
oscar1984

好吧我放弃了可能这里人太少

返回顶部
顶部