关于id类型对象的某些东西str(在python 2.7中)让我很困惑.该str类型是不变的,所以我希望,一旦它被创建,它将始终具有相同的id.我相信我不会这么说自己,所以我会发布一个输入和输出序列的例子.
>>> id('so')
140614155123888
>>> id('so')
140614155123848
>>> id('so')
140614155123808
Run Code Online (Sandbox Code Playgroud)
所以同时,它一直在变化.但是,在指向该字符串的变量之后,事情会发生变化:
>>> so = 'so'
>>> id('so')
140614155123728
>>> so = 'so'
>>> id(so)
140614155123728
>>> not_so = 'so'
>>> id(not_so)
140614155123728
Run Code Online (Sandbox Code Playgroud)
因此,一旦变量保存该值,它就会冻结id.的确,在del so和之后del not_so,id('so')开始的输出再次改变.
这是不相同的行为与(小)整数.
我知道不变性和拥有相同之间没有真正的联系id; 仍然,我试图弄清楚这种行为的来源.我相信那些熟悉python内部的人会比我更少惊讶,所以我试图达到同样的目的......
尝试使用不同的字符串会产生不同的结果......
>>> id('hello')
139978087896384
>>> id('hello')
139978087896384
>>> id('hello')
139978087896384
Run Code Online (Sandbox Code Playgroud)
现在它是平等的......
我正在使用 Python 3.8.3 & 在检查字符串的 id 时,我得到了一些意外的输出,如下所示。
>>> a="d"
>>> id(a)
1984988052656
>>> a+="e"
>>> id(a)
1985027888368
>>> a+="h"
>>> id(a)
1985027888368
>>> a+="i"
>>> id(a)
1985027888368
>>>
Run Code Online (Sandbox Code Playgroud)
在将 "h" 添加到 a 的行之后,id(a) 没有改变。当字符串不可变时,这怎么可能?当我使用 a=a+"h" 而不是 a+="h" 并在 .py 文件中运行此代码时,我得到了相同的输出(我提到了这一点,因为在某些情况下我们可以在 shell 中运行时看到不同的输出并在保存到文件后运行相同的代码)
直到现在我都相信Python字符串是不可变的但是当我尝试这个时我感到很困惑
>>> a
'hello world !'
>>> id(a)
140521043795728
>>> a+="d"
>>> id(a)
140521043795728
>>> a+="d"
>>> id(a)
140521043795728
>>> a
'hello world !dd'
Run Code Online (Sandbox Code Playgroud)
如果我使用+=运算符,虽然字符串已更改,但它不会更改对象ID.在这种情况下发生了什么?
现在这有点不同?https://ideone.com/eg1SIN
谁能解释一下这里发生了什么?