Python生成全排列时print输出正常append后元素全相同是什么原因
问题原因
核心是Python可变对象的引用传递特性,具体逻辑如下:
- 你代码中传入的排列对象是列表,属于可变对象,整个递归、回溯过程里所有的swap操作都是直接修改同一个列表的内存内容,全程没有生成新的列表实例。
- 生成器yield返回的是这个列表的引用,而非当前状态的副本。循环中
print(x)时打印的是当前时刻列表的实时内容,所以每次输出都符合预期,但result.append(x)只是将列表的引用存入结果数组,并没有复制当前的列表内容。 - 递归的回溯步骤
swap(perm,i,x)最终会将列表还原为初始状态,结果数组中存储的所有引用都指向同一个最终被还原的列表,因此最终打印result时所有元素完全一致。
修复方案
只需要在yield时返回当前列表的副本即可,将permutations函数中的yield string修改为yield string.copy()或者yield list(string)。
修复后的关键代码片段:
def permutations(string ,i=0): if i == len(string): # 返回当前列表的副本而非原引用 yield string.copy() for x in range(i, len(string)): perm = string swap(perm,x,i) yield from permutations(perm, i+1) swap(perm,i,x)
内容的提问来源于stack exchange,提问作者ToklCz
相关产品推荐
相关产品推荐

