为什么Python init偶尔会使用相同的地址清空可变对象?
我的问题可能看起来很奇怪和含糊不清,请检查以下代码:为什么Python init偶尔会使用相同的地址清空可变对象?,python,Python,我的问题可能看起来很奇怪和含糊不清,请检查以下代码: def foo(): for _ in range(4): x = [] print(id(x)) some_handler(x) 在控制台上,您将看到,例如: 4319661960 4319191112 4319661960 4319191112 众所周知,id()。在上面的代码片段中,我确实希望有四个不同的值,因此我实际上将x初始化为空列表,因此我将在稍后的某个函数中对其进行处理。现在我不能,因为x将保留循
def foo():
for _ in range(4):
x = []
print(id(x))
some_handler(x)
在控制台上,您将看到,例如:
4319661960
4319191112
4319661960
4319191112
众所周知,id()。在上面的代码片段中,我确实希望有四个不同的值,因此我实际上将x初始化为空列表,因此我将在稍后的某个函数中对其进行处理。现在我不能,因为x将保留循环中上一次运行的历史值
我很多时候都会陷入一些明显而愚蠢的陷阱。这里我错了什么?在循环结束时,如果没有对x
的其他引用,对象可能会立即被垃圾收集。这意味着该地址有资格在下次创建对象时重新使用
保存x
的值(例如,将其放入另一个列表),并查看ID是否唯一 看一看,这里有一个完整的解释:每次通过循环,python都可以自由地处理x
,并为x
创建一个新列表。新列表很可能会占用堆上与旧列表相同的地址。但是,如果保留一个或多个列表,则任何新列表都不能占用与现有列表相同的空间。简短回答:对象的id
仅保证在该对象的生命周期内是唯一的。如果对象消失,该id
可以重用。是。谢谢各位。特别是@kafels提供的链接非常有用。看起来我没有太多的选择,但在每次循环结束时手动清除x的值,使其工作@MurphyMeng我能问一下你想在这里做什么吗?您几乎不必担心Python中任何东西的id()
。。。