为什么Python有时会用相同的地址初始化空的可变对象?

时间:2019-04-28 15:18:38

标签: python

我的问题似乎很古怪和模棱两可,请检查以下代码:

def foo():
  for _ in range(4):
    x = []
    print(id(x))
    some_handler(x)

在控制台上,您将看到例如:

4319661960
4319191112
4319661960
4319191112

众所周知,id()提供了一个不透明值作为对象的标识符。在上面的代码片段中,我确实期望有四个不同的值,因此实际上我将x初始化为一个空列表,因此稍后将在some_handler()函数中对其进行处理。现在我不能,因为x会保留循环中先前运行的历史值。

我很多时候陷入了一个明显而愚蠢的陷阱。我在这里错了吗?

1 个答案:

答案 0 :(得分:1)

在循环结束时,如果没有其他对x的引用,则可以立即对对象进行垃圾回收。这意味着该地址可以在下次创建对象时重新使用。

保存x的值(例如,将其放入另一个列表中),然后查看ID是唯一的。