Python的id()方法
Python中的id()函数返回对象的“身份”。对象的身份是一个整数,在其生命周期内保证是唯一且不变的。两个生命周期不重叠的对象可能具有相同的id()值。在CPython的实现中,这是对象在内存中的地址。
Python 的 id() 函数可以返回对象的唯一标识符。
Python缓存常用数据类型(如字符串、整数、元组)的id()值。因此,如果多个变量的值相同,你可能会发现它们引用同一个对象并具有相同的id()值。让我们通过一个示例来验证这一点。
# integers
a = 10
b = 10
c = 11
d = 12
print(id(a))
print(id(b))
print(id(c))
print(id(d))
输出:将以下内容用中文自然地改写,只需要一个选项:
The car is red and it is parked on the street.
4317900064
4317900064
4317900096
4317900128
注意到 ‘a’ 和 ‘b’ 的 id() 值是相同的,它们具有相同的整数值。让我们看看字符串和元组是否也有相似的行为?
# tuples
t = ('A', 'B')
print(id(t))
t1 = ('A', 'B')
print(id(t1))
# strings
s1 = 'ABC'
s2 = 'ABC'
print(id(s1))
print(id(s2))
输出:
4320130056
4320130056
4320080816
4320080816
从输出来看,很明显Python对字符串和元组对象进行缓存,并利用它们来节省内存空间。
缓存仅能与不可变对象一起使用,注意整数、字符串和元组都是不可变的。因此,Python的实现可以利用缓存来节省内存空间并提高性能。
我们知道字典是可变的,让我们看看即使元素相同,不同字典的id()是否会有所不同?
# dict
d1 = {"A": 1, "B": 2}
d2 = {"A": 1, "B": 2}
print(id(d1))
print(id(d2))
输出:只需要一种选择,用中文将以下内容转述。
4519884624
4519884768
就像我们想的那样,字典对象返回了不同的id()值,似乎并没有缓存的机制。
自定义对象的Python id()函数
让我们来看一个获取自定义对象的id()值的简单示例。
class Emp:
a = 0
e1 = Emp()
e2 = Emp()
print(id(e1))
print(id(e2))
结果:
4520251744
4520251856
总结
Python中的id()函数返回的值保证对于一个对象来说是唯一且恒定的。我们可以利用这一点来确定两个对象是不是指向了同一个内存对象。
您可以从我们的GitHub代码库中查看完整的Python脚本和更多的Python示例。
参考资料:官方文档