Python 全排列中的局部变量问题

一个全排列的问题

def permute(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    ans=[]
    flag={}
    l = len(nums)
    for j in range(l):
        flag[j]=False
    def bt(tmp=[],flag=flag):
        if len(tmp) == l:
            print(tmp)
            ans.append(tmp)
        for i in range(l):
            if flag[i] == False:
                flag[i]=True
                tmp.append(nums[i])
                print(tmp)
                bt(tmp,flag)
                flag[i]=False
                tmp.pop()
    bt()
    return ans

    
if __name__ == '__main__':
    c=[1,2,3]
    res=permute(c)
    print(res) 

现在返回值为[[], [], [], [], [], []]
感到不解,,现在发现问题在tmp这个变量上,但是不知道为什么,请大佬解答,,谢谢!

阅读 1.7k
1 个回答

ans.append(tmp) 换成 ans.append([i for i in tmp])
或者换成 ans.append(copy.copy(tmp))

解释:
你一直在对同一个 list 操作,如

a = [1,2,3]
b = a
b.pop()
a  # [1,2]
b  # [1,2]
c = copy.copy(a)
c.pop()
a  # [1, 2]
c  # [1]

还有,要避免 可变数据类型作为函数定义中的默认参数,比如你上面的:

def bt(tmp=[], flag=flag)

最好不要这么写,虽然并不影响你的结果,参考:
http://www.pythontab.com/html...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题