Python ID 问题

Python id issues

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

再总结一下问题,number1和number2的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.

希望这能让您对该语言及其实现有所了解。