Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 .append()添加2个值并删除1个以前的值_Python_List - Fatal编程技术网

Python .append()添加2个值并删除1个以前的值

Python .append()添加2个值并删除1个以前的值,python,list,Python,List,嗨,我一直在试图弄明白为什么在这段代码中“permutations.append(lst)”不仅追加了两次,而且还删除了“permutations”中的第一项 def permute(lst): permutations = [] permutations.append(lst) flag = True while flag: k = len(lst) - 2 while k>=0: if lst[k]

嗨,我一直在试图弄明白为什么在这段代码中“permutations.append(lst)”不仅追加了两次,而且还删除了“permutations”中的第一项

def permute(lst):
    permutations = []
    permutations.append(lst)
    flag = True
    while flag:
        k = len(lst) - 2
        while k>=0:
            if lst[k] < lst[k+1]:
                break
            k -= 1
        else:
            flag = False
            break
        l = len(lst) - 1
        while l>k:
            if lst[k] < lst[l]:
                break
            l-=1
        lst[k], lst[l] = lst[l], lst[k]
        lst = lst[:k+1] + lst[len(lst)-1: k :-1]
        print('a')
        permutations.append(lst)
        print(lst, 'b')
    return permutations
print(permute([2,3,4,5])

这是因为当您将
lst
附加到
置换
时,实际上是将引用附加到对象,而不仅仅是对象的值。因此,当您随后更改
lst
的值时,
排列也会更改

list.copy()
只返回与原始对象解耦的列表值。同样,如果将
permutations.append(lst)
行替换为
permutations.append(lst.copy())
,则应获得所需的输出

列表引用效果与复制列表的对比演示:

>x=[1]
>>>y=[]
>>>y.append(x)#直接将x附加到y
>>>y
[[1]]
>>>x[0]=2
>>>y#改变x改变y
[[2]]
>>>y=[]
>>>y.append(x.copy())#将x的副本附加到y
>>>y
[[2]]
>>>x[0]=3
>>>改变x对y没有影响
[[2]]

我不认为这是问题所在,因为在每次迭代中使用
lst=lst[:k+1]+lst[len(lst)-1:k:-1]
将创建一个新对象。因此,排列中的所有对象都是唯一的对象,这就是为什么只有边缘情况才有问题,而整个列表不是同一组值。在提交我的答案之前,我运行了带有此更改的代码,以确保我没有弄错。我明白你的观点,奥利弗,问题所在的代码行是
lst[k],lst[l]=lst[l],lst[k]
,当他们到达这行代码时,他们已经将
lst
添加到排列列表中。因此,当这一行运行时,它实际上修改了排列中的最后一个条目。您的答案将避免这个问题,因为排列将有它自己的基于列表外的对象。我认为OP最好是重构代码,并在完成修改后以排列方式存储一个项目it@ChrisDoyle我并不反对对代码进行优化,我回答的目的纯粹是为了说明是什么导致了所看到的bug,以及内置功能的逻辑扩展来避免这种情况。啊,非常感谢。从不知道更改lst的值实际上会影响原始.append(lst)。伊玛,去读更多关于这方面的资料。再次感谢!您的问题可能在于将lst附加到置换中。然后,您可以通过将其中的值与
lst[k],lst[l]=lst[l],lst[k]
交换来更改lst。因此,您已经有效地更改了存储在排列中的最后一项。您应该修改您的代码,以便您只在完成某个项目后将其进行排列。不要修改你已经在排列中放置的任何东西。
[[2, 3, 5, 4], [2, 4, 5, 3], [2, 4, 5, 3], [2, 5, 4, 3], [2, 5, 4, 3], [3, 5, 4, 2], [3, 2, 5, 4], [3, 4, 5, 2], [3, 4, 5, 2], [3, 5, 4, 2], [3, 5, 4, 2], [4, 5, 3, 2], [4, 2, 5, 3], [4, 3, 5, 2], [4, 3, 5, 2], [4, 5, 3, 2], [4, 5, 3, 2], [5, 4, 3, 2], [5, 2, 4, 3], [5, 3, 4, 2], [5, 3, 4, 2], [5, 4, 3, 2], [5, 4, 3, 2], [5, 4, 3, 2]]