Python 3.x Python3.6:值的内存地址与变量的内存地址

Python 3.x Python3.6:值的内存地址与变量的内存地址,python-3.x,list,variables,memory-address,built-in,Python 3.x,List,Variables,Memory Address,Built In,我目前正在使用Python3.6,我正在使用id()函数。 当我在空闲状态下运行以下代码时 x=1 打印(身份证(x)、身份证(1)) 这两个内存地址相同。(1499456272对我来说)我的理解是整数1,它是一个对象,有一个内存地址,当对象被分配到x时,变量获得与对象相同的内存地址。(不确定这是否正确) 例如,当我使用字符串复制上述代码时 s=“a” 打印(身份证、身份证(“a”)) 我还得到两个相同的内存地址。同样,我目前关于为什么会发生这种情况的推理与上面相同 然而,当我尝试使用列表时,我

我目前正在使用Python3.6,我正在使用id()函数。 当我在空闲状态下运行以下代码时

x=1

打印(身份证(x)、身份证(1))

这两个内存地址相同。(1499456272对我来说)我的理解是整数1,它是一个对象,有一个内存地址,当对象被分配到x时,变量获得与对象相同的内存地址。(不确定这是否正确)

例如,当我使用字符串复制上述代码时

s=“a”

打印(身份证、身份证(“a”))

我还得到两个相同的内存地址。同样,我目前关于为什么会发生这种情况的推理与上面相同

然而,当我尝试使用列表时,我没有得到相同的内存地址。比如说,

l=[1]

打印(id(l),id([1]))

给我1499456272和67146456


有人能解释一下为什么会发生这种情况吗?也许我目前关于int和string为何具有相同内存地址的推理是有缺陷的。谢谢:D

cPython实习从
-5
256
的所有整数以及字符串文本。这意味着无论何时获得这样的值,Python都知道它在内存中有一个副本,并返回相同的对象

尽管如此,这两种类型发生的方式是不同的

对于整数,这些值总是被保留,从而使过程是动态的

另一方面,字符串实习发生在编译时,因此特定于字符串文本

我们可以用
is
做一些实验,这相当于比较活动对象的
id

x = 1 + 1
y = 3 - 1
x is y # True

x = 'b'
y = 'b'
x is y # True

x = 257
y = 257
x is y # False

x = 'ab'.replace('a', '')
y = 'b'
x is y # False
尽管对于其他类型的对象(例如
list
)来说情况并非如此,也就是说,因为它们是可变的,所以您绝对不希望返回相同的对象

[] is [] # False

尽管如此,底线是这是一个优化实现,您不应该在代码中依赖它。一般来说,假设不同的表达式返回不同的对象,因为以上都是例外。

Python中没有经典(C)意义上的“变量”。一切都是对象。它与变量无关,只是CPython总是对值1和字符串
“a”
重用同一个int对象,但对列表不这样做。问题可以归结为
1是1
返回True,
[]是[]
返回False,因为这两个列表不是同一个列表实例。-缓存了5到256个:相同的id: