Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python init偶尔会使用相同的地址清空可变对象?_Python - Fatal编程技术网

为什么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()
。。。