我正在玩以下代码,发现字符串变量具有相同的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
。
希望这能为您提供有关该语言及其实现的一些见解。