Python id()

时间:2020-02-23 14:42:47  来源:igfitidea点击:

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))

输出:

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

正如我们所想,dict对象返回的id()值不同,并且这里似乎没有缓存。

自定义对象的Python id()

让我们看一个简单的示例,获取自定义对象的id()值。

class Emp:
  a = 0

e1 = Emp()
e2 = Emp()

print(id(e1))
print(id(e2))

输出:

4520251744
4520251856