Python id()

106 阅读2分钟

Python id() 函数返回对象的 "身份"。一个对象的身份是一个整数,它被保证在这个对象的生命周期内是唯一的和恒定的。两个生命周期不重叠的对象可能有相同的id()值。在CPython的实现中,这是对象在内存中的地址。 ## Python id() Python缓存了常用数据类型的id()值,例如[string](/community/tutorials/python-string), [integer](/community/tutorials/python-numbers), [tuples](/community/tutorials/python-tuple) 等。因此,你可能会发现,如果多个变量的值相同,那么它们就会引用同一个对象,并具有相同的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()值是相同的,它们的整数值相同。让我们看看我们是否也能在字符串和图元中得到类似的行为? ``` # 图元 t = ('A', 'B') print(id(t)) t1 = ('A', 'B') print(id(t1)) # 字符串 s1 = 'ABC' s2 = 'ABC' print(id(s1)) print(id(s2)) ```输出。 ```4320130056 4320130056 4320080816 4320080816 ```从输出中可以看出,Python缓存了字符串和元组对象,并使用它们来节省内存空间。 缓存只对不可变的对象起作用,注意,整数、字符串、元组是不可变的。所以Python的实现可以使用缓存来节省内存空间并提高性能。 我们知道[字典](/community/tutorials/python-dictionary)不是不可变的,让我们看看即使元素相同,不同的字典的id()是否不同? ``` # dict d1 = {"A"。1, "B": 2} d2 = {"A":1, "B": 2} print(id(d1)) print(id(d2)) ``` 输出: ``` 4519884624 4519884768 ``` 如我们所想,dict对象返回不同的id()值,这里似乎没有缓存。 ## Python id() for custom object 让我们看一个简单例子,为一个自定义对象获取id()值。 ``` class Emp: a = 0 e1 = Emp() e2 = Emp() print(id(e1)) print(id(e2)) ``` Output: ``` 4520251744 4520251856 ``` ## Summary Python id()值对一个对象来说保证是唯一和不变的。我们可以用它来确定两个对象在内存中是否指的是同一个对象。 你可以从我们的[GitHub仓库](github.com/journaldev/… 参考资料。[官方文档](docs.python.org/3.7/library…)