考虑以下代码
a,b="hello","hello"
print id(a),id(b)
输出
28954752 28954752
输出对于char,string等是相同的 但现在考虑列表
list1=[1,2,3,4]
list2=[1,2,3,4]
print id(list1),id(list2)
输出
139706054367136 139706054368360
我们可以看到给出的地址在list / tuple / dict的情况下是不同的,如果它们是引用变量那么为什么string为相同的值赋予相同的地址?
答案 0 :(得分:1)
有时(并且通过设计它是一个实现细节)Python caches certain values可以重复使用。
特别是它只能安全地缓存不可变类型,如字符串和整数。由于list1
和list2
是可变的,因此它们在内部引用同一个对象会有问题,因为一个对象的突变会反映在另一个对象中。
假设Python有某种列表缓存,那么list1
和list2
最终会引用相同的对象:
> print(id(list1) == id(list2))
True
> list1[0] = 5
> print(list2)
[5, 2, 3, 4]
这不是一件好事,而不是它的工作方式 - 与你一起工作会很麻烦!
答案 1 :(得分:0)
list1=[1,2,3,4]
list2=[1,2,3,4]
创建两个恰好具有相同值的对象。不同的对象有不同的ID。 (在这种情况下,您可以单独修改它们中的任何一个。)
list1=list2=[1,2,3,4]
创建对同一对象的2个引用。对象是相同的,他们有相同的ID。 (在这种情况下,您无法在不更改list1
的情况下修改list2
。)
对于字符串,它有点微妙:即使你做了,python也只创建一个对象"hello"
a = "hello"
b = "hello"
顺便说一句,您也可以直接致电id("hello")
并找到相同的结果。