说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
id(object) 返回对象的“标识值”。该值是一个整数,在此对象的生命周期中保证是唯一且恒定的。两个生命期不重叠的对象可能具有相同的 id() 值。在 CPython 实现中这就是内存中对象的地址。对象的 id 对于 Python 缓存这些变量的值很有用。这种使用 id() 检索缓存值的机制使 Python 的性能更好!这在多个变量引用同一对象的情况下也有帮助。注:本页的代码 id 结果不会与你执行相同代码时相同。
语法为 id(object)
,由于在 Python 一切皆为对象,所有的对象都可以传入 id() 中。示例:
a = 1
id(a)
# 140232072763696
id(1)
# 140232072763696
id(lambda x: x+1)
# 140359443164176
def hello():
print('hello!')
id(hello)
# 140231834272240
# 未定义的名称
id(test)
# NameError: name 'test' is not defined
上例中,a
与 1
的 id() 返回值相同,则证明它们在内存中的地址(memory address of the Python object)相同。这个地址只在一个生命周期内是相同的,如果重启解释器(交互窗口)或者重新执行,则会改变。
>>> l1 = [1, 2, 3, 4]
>>> l2 = [1, 2, 3 ,4]
>>> id(l1)
2775665206344
>>> id(l2)
2775665185224
对于可变对象,内容即使相同它们的内存地址也不同。请记住,缓存只能在不可变的 Python 对象上工作,如整数、字符串和浮点。元组、列表等是可变对象,因此缓存在这里不起作用!
class Student:
data = 0
e1 = Student()
e2 = Student()
print(id(e1))
print(id(e2))
# 140231806582208
# 140231806582688
上边说了,如果对象的内容相同,Python 不会新开辟空间存储,而是指向同一个对象,下边的两个对象 id() 是相同的!
a = 'Hello'
id(a)
# 140359442720432
b = 'He' + 'llo'
id(b)
# 140359442720432
判断两个对象是否相等,可以用 is 操作:
a is b
# True
它就等于:
id(a) == id(b)
两个对象如何才能相等要比我们想象的复杂很多,但核心的方法是重写 __eq__
方法,这个方法返回 True,则表示两个对象相等,否则,就不相等。相反的,如果两个对象不相等,则重写 __ne__
方法。
默认情况下,如果你没有实现这个方法,则使用父类(object)的方法。父类的方法比较是的两个对象的ID(可以通过id方法获取对象ID),也就是说,如果对象的ID相等,则两个对象也就相等。因此,我们可以得知,默认情况下,对象只和自己相等。
id(object)
除了查询标识信息外,还有以下用途:
更新时间:2021-10-29 10:56:17 标签:python id