首页 > Python 列表append为何会重新排列列表中的元素?

Python 列表append为何会重新排列列表中的元素?

问题:在做一个Python习题,习题中要求写一个函数,函数将一个列表的所有排序给列出来,并返回以[[a,b,c],[a,c,b],...]的结果,但是我在返回处理后的结果时,结果变成[[a,b,c],[a,b,c],...]

代码如下:

#coding:utf-8

result = []
box = [0] * 3
book= [0] * 3
def permute(step):
    if step > 2:
        result.append(box)
        return
    for x in xrange(0,len(li_e)):
        if book[x] == 0:
            box[step] = li_e[x]
            book[x] = 1
            permute(step + 1)
            book[x] = 0
    return result
li_e = [1,2,3]
print permute(0)

我该如何修改代码?
另:是否有更好的写法呢,求指导,谢谢!


调用result.append(box)时的时候仅仅是把box的引用添加进去了,result中的所有列表其实都指向同一个地址(即全局的box)。

在更新结果的时候显式深拷贝就好了。

#coding:utf-8
from copy import deepcopy
result = []
box = [0] * 3
book= [0] * 3
def permute(step):
    if step > 2:
        result.append(deepcopy(box)) # deepcopy list
        return
    for x in xrange(0,len(li_e)):
        if book[x] == 0:
            box[step] = li_e[x]
            book[x] = 1
            permute(step + 1)
            book[x] = 0
    return result
li_e = [1,2,3]
print permute(0)

建议尽量不要使用:box = [0] * 3 这种形式的初始化,因为它们三个元素,其实就是一回事,指向了同一个内存,改一个,三个都改。很容易出错。初始化的话,可以用列表推导:

box = [0 for i in range(3)]  #  一维
box = [ [0 for i in range(3)] for j in range(3)]  #  二维
【热门文章】
【热门文章】