我有一个全局列表变量。我将全局列表的一个浅拷贝作为参数发送给另一个函数。在
令人惊讶的是,当我从被调用函数的参数中删除一些元素时,原始列表会发生更改。在
有人能告诉我为什么会发生这种事,以及如何防止这种情况发生?在
下面是简化的代码示例:
def saveCandidateRoutes(candidateRoutes):
for route in candidateRoutes:
if route: # check if the list, 'route', is empty.
tweetId = route.pop(0)
stanox = route.pop(-1)
....
def main():
global allCandidatePaths
copyOfAllCandidatePaths= list(allCandidatePaths) # making a deep copy
result = saveCandidateRoutes(copyOfAllCandidatePaths)
我想你对这些条款感到困惑。在
浅拷贝是一种复制类型,其中被复制列表的元素仍然与原始列表的元素绑定到相同的内存值。在
你在找什么 Here is a good source to find out.
还有: Wikipedia
我想你需要一个关于浅拷贝和深拷贝的快速提醒,以及如何制作深拷贝。在
}的浅拷贝,可以检查}是否是不同的对象,因为它们不共享相同的
^{pr2}$b
和c
都是{a
、b
和{id
。在但是,}的每个元素仍然是对我们在定义a时创建的列表}的引用。当我们对列表中的一个项进行变异时,这一点就变得很清楚了:
a
、b
和{[1,2]
和{如您所见,第二个列表的第二个元素在}中发生了变化。
现在,要制作
a
、b
和{a
的深拷贝,有几个选项。一种是列表理解,您可以复制每个子列表:如您所见,}中的第二个列表是不同的对象:
a
中的42没有更改为23
,因为a
和{另一种创建深度副本的方法是使用
copy.deepcopy
:python使用对对象的引用,这意味着}都指向内存中的同一个列表,您可以使用它们来更改列表。在
allCandidatePaths
和{为了防止这种情况发生,在函数
saveCandidateRoutes
的开头添加以下指令candidateRoutes = list(candidateRoutes)
。list()
函数将在内存中创建原始列表的另一个副本,并将其引用分配给candidateRoutes
。在因此,当您使用
candidateRoutes
时,您将不会处理main函数中的原始列表,而是处理另一个列表。在相关问题 更多 >
编程相关推荐