【发布时间】:2018-05-29 04:30:05
【问题描述】:
我正在努力研究可变和不可变对象。我已经读过字符串是不可变的,并且对于每个字符串,都会使用不同的对象 ID 创建一个单独的对象。我正在尝试使用下面的简单代码来验证这一点,但是,我看到多个不同的字符串具有相同的对象 ID。有人可以澄清一下吗。提前致谢。
mystring = ""
mylist = ["This ", "That ", "This ", "That ", "This ", "That ", "This ", "That "]
for item in mylist:
mystring = mystring + item
print("mystring: ", mystring, "ID of mystring: ", id(mystring))
导致以下输出:
mystring: This ID of mystring: 6407264
mystring: This That ID of mystring: 42523448
mystring: This That This ID of mystring: 42523448
mystring: This That This That ID of mystring: 6417200
mystring: This That This That This ID of mystring: 42785608
mystring: This That This That This That ID of mystring: 42785608
mystring: This That This That This That This ID of mystring: 42837536
mystring: This That This That This That This That ID of mystring: 42775856
【问题讨论】:
-
ids 在不使用时会被回收,因此您看到相同的id也就不足为奇了,因为您正在丢弃旧字符串。 -
@AChampion:除了生命周期真的应该重叠,所以ID重用应该是无效的。这里有一个优化,它不能完全保留语言对
id返回值和字符串不变性的保证。 -
@user2357112 生命周期不重叠。
-
@wim:在计算
mystring + item和分配给mystring之间,连续mystring值的生命周期应该重叠。生命周期重叠不是可传递的,但这并不重要,因为我们看到 ID 重复用于连续的mystring值。如果不是mystring = mystring + item的就地优化,就不会发生这种ID复用。 -
@wim:如果不进行优化,新的
mystring值会在名称绑定操作之前出现,然后名称绑定会结束旧的mystring值的生命周期。+和=之间会有一个生命周期重叠。
标签: python string immutability