Python id()函数返回对象的“标识”。对象的标识是一个整数,保证在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的id()值。在CPython实现中,这是对象在内存中的地址。
Python id()
Python会缓存常用数据类型的id()值,例如字符串、整数、元组等。因此,如果它们的值相同,您可能会发现多个变量引用同一对象并具有相同的id()值。让我们通过一个示例来验证这一点。
# 整数
a = 10
b = 10
c = 11
d = 12
print(id(a))
print(id(b))
print(id(c))
print(id(d))
输出:
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示例。
参考:官方文档
Source:
https://www.digitalocean.com/community/tutorials/python-id