首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用递归函数中的列表追加一个空列表

用递归函数中的列表追加一个空列表
EN

Stack Overflow用户
提问于 2018-09-24 21:27:54
回答 2查看 619关注 0票数 1
代码语言:javascript
复制
def permute(nums):
    result = []
    get_permute([], nums, result)
    return result

def get_permute(current, num, result):

    if not num:
        result.append(current+[])

    for i, v in enumerate(num):
        current.append(num[i])
        get_permute(current, num[:i] + num[i + 1:], result)
        current.pop()

if __name__ == "__main__":

    r = permute([1,2,3])

    for perm in r:
        print(perm)

如果我删除打印空白列表的+[] it,current + []result.append(current+[])中会做什么。

EN

回答 2

Stack Overflow用户

发布于 2018-09-24 21:31:29

它在复制名单。删除它时,会遇到List of lists changes reflected across sublists unexpectedly问题,因为外部列表包含许多对同一列表的引用,而不是对许多不同列表的引用。

您应该能够将其替换为current.copy() (使用PythonPython3.3)或list(current),以避免将来的读者产生类似的混淆。(这里有a lot of ways to copy a list。选择你喜欢的并坚持下去。)

票数 4
EN

Stack Overflow用户

发布于 2018-09-24 21:31:58

+ []是做什么的?

它生成一个与旧列表具有相同内容的新列表。

代码语言:javascript
复制
>>> x = [1]
>>> id(x) == id(x + [])
False
>>> x == x + []
True

为什么我需要这个?

在你的结果中添加副本时,你会在你的结果中多次拥有相同的列表,每次你更新该列表时,它都会影响你的结果。

代码语言:javascript
复制
>>> x = [1, 2]
>>> result = []
>>> result.append(x)
>>> x.append(3)
>>> result.append(x)
>>> result
[[1, 2, 3], [1, 2, 3]]

使ways更具可读性的一些可能的方法是

代码语言:javascript
复制
result.append(current[:])

代码语言:javascript
复制
result.append(list(current))

如果删除+ [],为什么返回空白列表

因为如果您不将副本附加到结果中,则结果中将只有一个列表,但会多次出现。在这个列表上调用.append(num[i])的频率与调用.pop()的频率一样高,这会导致该列表为空。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52480524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档