列表推导中的python中的递归函数调用给出的结果与首先将调用的结果赋给变量的结果不同

jon*_*rry 2 python

为什么不这样:

def subsets(x):
    if not x:
        return [[]]
    else:
        return [x + y for x in [[], [x[0]]] for y in subsets(x[1:])]

print subsets(['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

产生与此相同的输出:

def subsets(x):
    if not x:
        return [[]]
    else:
        z = subsets(x[1:])
        return [x + y for x in [[], [x[0]]] for y in z]

print subsets(['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

问题是你使用的名称x是两个不同的东西.当您x在列表推导中引入变量时,它会隐藏x在函数中定义的变量.因此,x列表理解中的最终结果并不是 x指您所希望的.

将其中一个重命名x为其他内容可以解决问题:

def subsets(original_x):
    if not original_x:
        return [[]]
    else:
        return [x + y for x in [[], [original_x[0]]]
                      for y in subsets(original_x[1:])]
Run Code Online (Sandbox Code Playgroud)

我还建议您尝试为变量找到更具描述性的名称.这将减少意外重复使用名称的可能性.