为什么内存地址对于相同的值不相同

时间:2016-08-12 04:30:55

标签: python

考虑以下代码

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为相同的值赋予相同的地址?

2 个答案:

答案 0 :(得分:1)

有时(并且通过设计它是一个实现细节)Python caches certain values可以重复使用。

特别是它只能安全​​地缓存不可变类型,如字符串和整数。由于list1list2是可变的,因此它们在内部引用同一个对象会有问题,因为一个对象的突变会反映在另一个对象中。

假设Python有某种列表缓存,那么list1list2最终会引用相同的对象:

> 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")并找到相同的结果。