Python id()是Python的一个内置函数,其作用是返回一个对象的身份标识。Python中一个对象的标识是一个整数。该整数保证对象在其生命周期中是唯一和固定的。在非覆盖的生命周期中,两个对象可能有相同的id()值,在CPython的底层实现中,id()函数用作获取对象的内存地址。
val = id(object)
object:用于获取标识的对象。
该函数的返回值是一个整数,是对象的标识。
Python中对象的id对于缓存变量的值是非常有用的,Python使用id()函数检索变量值的机制使Python具有更好的性能,也会出现对于多个变量具有相同值的话,其id()值也会相同的。
a = 123
b = 123
c = b
print(f"id(a)={id(a)}")
print(f"id(b)={id(b)}")
print(f"id(c)={id(c)}")
d1 = 124
d2 = 124.0
e1 = 112.1
e2 = 112.1
print(f"id(d1)={id(d1)}")
print(f"id(d2)={id(d2)}")
print(f"id(e1)={id(e1)}")
print(f"id(e2)={id(e2)}")
f = 1+2j
g = 1+2j
print(f"id(f)={id(f)}")
print(f"id(g)={id(g)}")
h = 10
i = 0b1010
j = 0xA
print(f"id(h)={id(h)}")
print(f"id(i)={id(i)}")
print(f"id(j)={id(j)}")
输出结果如下:
id(a)=8791228343776
id(b)=8791228343776
id(c)=8791228343776
id(d1)=8791228343808
id(d2)=46971184
id(e1)=44969648
id(e2)=44969648
id(f)=47414032
id(g)=47414032
id(h)=8791228340160
id(i)=8791228340160
id(j)=8791228340160
从上面的输出的结果中可以具有相同值和类型的变量具有相同的id()值,即使不同的进制形式,如值相同其id()值也是相同的。这种机制使值相同的变量指向相同的内存以节省内存。
同时,也可以看到变量a,b,c和变量d1之间相差32,这正好是4个字节的32位。
下面再看看这种情况是否在字符串和元组中是否也存在。
str1 = "abc"
str2 = "abc"
str3 = "AbC"
print(f"id(str1)={id(str1)}")
print(f"id(str2)={id(str2)}")
print(f"id(str3)={id(str3)}")
t1 = (11,12,13)
t2 = (11,12,13)
t3 = (11,12,13.0)
print(f"id(t1)={id(t1)}")
print(f"id(t2)={id(t2)}")
print(f"id(t3)={id(t3)}")
输出结果:
id(str1)=31050992
id(str2)=31050992
id(str3)=47970032
id(t1)=47936000
id(t2)=47936000
id(t3)=47968768
从输出结果可以看出,具有相同值的字符串和元组也具有相同的id()值,不同的字符串或元组其id()值不同。
对字典或列表是否也是这样呢?
d1 = {"k1":1,"k2":2}
d2 = {"k1":1,"k2":2}
d3 = d2
print(f"id(d1)={id(d1)}")
print(f"id(d2)={id(d2)}")
print(f"id(d3)={id(d3)}")
lst1 = [11,12,13]
lst2 = [11,12,13]
lst3 = lst2
print(f"id(lst1)={id(lst1)}")
print(f"id(lst2)={id(lst2)}")
print(f"id(lst3)={id(lst3)}")
输出结果如下:
id(d1)=47521472
id(d2)=47969088
id(d3)=47969088
id(lst1)=47908352
id(lst2)=47910080
id(lst3)=47910080
从输出结果可以看出,值相同的字典或列表,其id()值不相同,只有通过两个变量直接赋值的形式,其才会共享内存,具有相同的id()值。
总结以上各个案例可以看出,对于不可变对象(数字、字符串、元组)其值若相同,则变量的id()值是相同的,而对于可变对象(字典、列表)其值相同,但id()值不会相同,只有通过变量间直接赋值时,其id()值才会相同。
4、参数是自定义对象
#自定义对象
class Test:
def __init__(self):
self.data = 0
tmp1 = Test()
tmp2 = Test()
print(f"id(tmp1)={id(tmp1)}/nid(tmp2)={id(tmp2)}")
输出结果:
id(tmp1)=47312080
id(tmp2)=48514816
以上是关于Python中内置函数id()的使用方法及案例,如有疑问请留言。
新闻热点
疑难解答