为什么我的列表没有在Python中的每个循环上重置

为什么我的列表没有在Python中的每个循环上重置,python,list,tuples,Python,List,Tuples,我有一个函数需要接受一个名为edges的列表。我需要预成型许多循环,在每个循环上我更改边的属性值。在下一个循环开始时,我需要边以其原始值表示。为了尝试处理这个问题,我将列表转换为一个元组,这样它就不会是可变的,并将其分配给PermEdge。然后从PermEdge初始化Trialges,以便对Trialges进行更改。对Trialges的更改将保留在下一个循环中,我不知道为什么 如果有人能解释为什么输出不一致,以及我如何实现在每个循环开始时都有相同列表的目标,我将永远感激:) 输入和输出示例: i

我有一个函数需要接受一个名为edges的列表。我需要预成型许多循环,在每个循环上我更改边的属性值。在下一个循环开始时,我需要边以其原始值表示。为了尝试处理这个问题,我将列表转换为一个元组,这样它就不会是可变的,并将其分配给PermEdge。然后从PermEdge初始化Trialges,以便对Trialges进行更改。对Trialges的更改将保留在下一个循环中,我不知道为什么

如果有人能解释为什么输出不一致,以及我如何实现在每个循环开始时都有相同列表的目标,我将永远感激:)

输入和输出示例:

input:    
[[1, 2], [1, 3], [1, 4], [1, 7]]
output:
[[1, 2], [1, 3], [1, 4], [1, 7]]
[[100, 2], [1, 3], [1, 4], [1, 7]]
[[100, 2], [1, 3], [1, 4], [1, 7]]

第一行是我想要重复3次的内容

permEdges
可能是一个元组,但它的内容不是;请记住,
permEdges
trialidges
都存储指向四个双元素列表的指针。当您将
trialges[0][0]=100
设置时,您正在修改但不替换
trialges
的第一个元素,它也是
permEdges
的第一个元素

有几种方法可以实现您的目标,但可能是最好的:

import copy

def randomMinCut(edges):
    tries = 3

    for i in xrange(tries):
        trialEdges = copy.deepcopy(edges)
        print trialEdges
        trialEdges[0][0] = 100

    return

permEdges
可以是元组,但其内容不是元组;请记住,
permEdges
trialidges
都存储指向四个双元素列表的指针。当您将
trialges[0][0]=100
设置时,您正在修改但不替换
trialges
的第一个元素,它也是
permEdges
的第一个元素

有几种方法可以实现您的目标,但可能是最好的:

import copy

def randomMinCut(edges):
    tries = 3

    for i in xrange(tries):
        trialEdges = copy.deepcopy(edges)
        print trialEdges
        trialEdges[0][0] = 100

    return

@保罗鲁尼我很困惑这会如何影响我的问题。我对范围的理解是,从for循环获取值时会出现问题,但这一切都是在循环中完成的,trialges在打印之前会超时“重置”statement@PaulRooney我对这会如何影响我的问题感到困惑。我对范围的理解是,当从for循环获取值时,它会导致问题,但这一切都是在循环中完成的,trialges会在print语句之前超时“重置”。感谢您解释这样使用tuple的问题。我假设元组中的任何东西都不能被改变,但我现在明白你的意思了,这很有道理。我真的不想使用deepcopy,因为将有另一个包含上述for循环的循环,它将经过大约1000000次迭代。你认为循环我的元组并使所有的子列表也成为元组合理吗?或者有更好的方法在一开始就这样做吗?请注意,deepcopy的成本与手动将所有内容复制到元组的成本一样高。在不知道您尝试应用哪些转换(或者更确切地说,您尝试不应用哪些转换)的情况下,我不确定该提供什么建议。一种方法是有选择地重新创建列表,尽管这显然不太优雅,可能只适用于你的例子,而不适用于你试图解决的实际问题<代码>Trialges=[[100,边[0][1]]]+边[1::][/code>感谢您的建议。我最终使用了一组元组。它允许我通过将其转换为元组列表,然后在需要时交换元组来制作副本。最后,虽然我选择了一个非常糟糕的数据结构,这使得代码运行速度非常慢(从实用角度来看,速度非常慢),但我还是选择了Union-Find数据结构。感谢您解释这样使用元组的问题。我假设元组中的任何东西都不能被改变,但我现在明白你的意思了,这很有道理。我真的不想使用deepcopy,因为将有另一个包含上述for循环的循环,它将经过大约1000000次迭代。你认为循环我的元组并使所有的子列表也成为元组合理吗?或者有更好的方法在一开始就这样做吗?请注意,deepcopy的成本与手动将所有内容复制到元组的成本一样高。在不知道您尝试应用哪些转换(或者更确切地说,您尝试不应用哪些转换)的情况下,我不确定该提供什么建议。一种方法是有选择地重新创建列表,尽管这显然不太优雅,可能只适用于你的例子,而不适用于你试图解决的实际问题<代码>Trialges=[[100,边[0][1]]]+边[1::][/code>感谢您的建议。我最终使用了一组元组。它允许我通过将其转换为元组列表,然后在需要时交换元组来制作副本。最后,虽然我选择了一个非常糟糕的数据结构,这使得代码运行速度非常慢(实际上非常慢),但我还是选择了Union Find数据结构。