Python id issues



我正在玩以下代码,发现字符串变量具有相同的id。 谁能告诉我为什么只有字符串的行为与其他两个 int 和列表类型不同?

再次总结这个问题,数字 1 和数字 2 具有不同的 ID。 list1 和 list2 也有不同的 ID。但是,string1、string2 甚至 string3 与其他字符串变量具有相同的 id...!

number1 = 123456
number2 = 123456
number3 = number1
print(id(number1))
print(id(number2))
print(id(number3))
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1
print(id(list1))
print(id(list2))
print(id(list3))
string1 = 'hello'
string2 = 'hello'
string3 = string1
print(id(string1))
print(id(string2))
print(id(string3))

您已经观察到了一些内部实现细节(语言无法保证的优化(:

  • -5 <= x <= 256范围内的整数在启动时预先计算并重复使用。

  • 直接在程序string1 = 'hello'中键入的字符串将被暂留和重用。

还有一些有保证的行为:

  • 诸如string3 = string1之类的作业从不复制。

  • 新的可变对象永远不会重复使用:[1, 2, 3]。 它们必须是不同的,这样它们才能随着时间的推移而发生不同的变异。

  • 单例(如None(仅实例化一次,并且可以使用对象标识进行可靠的比较:result is None

希望这能为您提供有关该语言及其实现的一些见解。

最新更新