Python 3.6:值的内存地址与变量的内存地址

时间:2018-06-11 19:54:38

标签: python-3.x list variables memory-address built-in

我目前正在使用python 3.6,而我正在使用id()函数。 当我在IDLE中运行以下代码时,

x = 1

print(id(x),id(1))

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

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

s =“a”

print(id(s),id(“a”))

我还得到两个相同的内存地址。同样,我目前对此发生原因的推理与上述相同。

但是,当我使用列表尝试此操作时,我没有获得相同的内存地址。例如,

l = [1]

print(id(l),id([1]))

给了我1499456272和67146456。

任何人都可以向我解释为什么会这样吗?也许我目前关于为什么整数和字符串具有相同内存地址的推理是有缺陷的。谢谢:D

1 个答案:

答案 0 :(得分:0)

Python将所有整数从claims <- structure(list(a = c(13245, 43220, 45221), b = 1:3), .Names = c("a", "b"), row.names = c(NA, -3L), class = "data.frame") structure(list(a = 10:20, b = 21:31), .Names = c("a", "b"), row.names = c(NA, -11L), class = "data.frame") claims.mapping <- structure(list(col.name.std = structure(1:3, .Label = c("a", "b", "c"), class = "factor"), x = c("Date", "numeric", "character")), row.names = c(NA, -3L), class = "data.frame") 传递到-5以及字符串文字。这意味着无论何时获得这样的值,Python都知道它在内存中有一个copie并返回相同的对象。

虽然这两种类型的发生方式不同。

对于整数,这些值始终是实际的,允许该过程是动态的。

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

我们可以使用256进行一些实验,这相当于比较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

尽管如此,最重要的是这是一个优化实现,您不应该在代码中依赖它。通常,假设不同的表达式返回不同的对象,因为上面是例外。