Python 3.x Python3.6:值的内存地址与变量的内存地址
我目前正在使用Python3.6,我正在使用id()函数。 当我在空闲状态下运行以下代码时 x=1 打印(身份证(x)、身份证(1)) 这两个内存地址相同。(1499456272对我来说)我的理解是整数1,它是一个对象,有一个内存地址,当对象被分配到x时,变量获得与对象相同的内存地址。(不确定这是否正确) 例如,当我使用字符串复制上述代码时 s=“a” 打印(身份证、身份证(“a”)) 我还得到两个相同的内存地址。同样,我目前关于为什么会发生这种情况的推理与上面相同 然而,当我尝试使用列表时,我没有得到相同的内存地址。比如说, l=[1] 打印(id(l),id([1])) 给我1499456272和67146456Python 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”)) 我还得到两个相同的内存地址。同样,我目前关于为什么会发生这种情况的推理与上面相同 然而,当我尝试使用列表时,我
有人能解释一下为什么会发生这种情况吗?也许我目前关于int和string为何具有相同内存地址的推理是有缺陷的。谢谢:DcPython实习从
-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: