将列表理解传递给 Python 中的函数

Passing List Comprehension to a function in Python

我有一个函数,我想在其中将列表理解作为输入传递给它。我收到有关未定义 my_list 的错误。我知道我可以将 my_list 放在函数之外,但实际上该列表是作为函数的一部分生成的。

实际定义很复杂,所以这里是简化的例子:

def my_def(list_comp):
    global my_list
    my_list = [[1,2],[3,4]]
    list_comp_output = list_comp
    return list_comp_output

print my_def([x[1] for x in my_list])

那是因为my_list没有定义;)

首先你必须意识到函数定义中的主体(但是如果有默认参数,这些将立即被评估)直到函数被实际调用才执行,但它的参数被评估在函数被调用之前。

其中的前两个语句首先表示符号my_list是此函数中的全局范围的符号。第二个表示为该符号(在全局范围内)分配值 [[1,2],[3,4]]。但正如所提到的那样,这不会在函数被调用之前发生(所以在函数定义之后它仍然没有定义)。

这样做的结果是您尝试在定义或分配给(在函数体中)之前评估 my_list(调用函数时)。

您可以尝试通过先调用 my_def([]) 来实现它,这将定义 my_list,但正确的方法可能是将 my_list 的定义放在函数之外定义:

my_list = [[1,2],[3,4]]

def my_def(list_comp):
   list_comp_output = list_comp
   return list_comp_output

print my_def([x[1] for x in my_list])

其中给出了答案:

[2, 4]

实际上我们在Python中所拥有的只是运行时间;没有单独的编译时间1。(在解释器的范围内)。函数也不例外。

所以你在这里所做的是将 my_list 定义为全局变量并尝试在列表理解中使用它,而 python 没有定义这样的东西。

您只需 运行 您的函数 1 次,然后使用该列表推导式即可:

def my_def(list_comp):
    global my_list
    my_list = [[1,2],[3,4]]
    list_comp_output = list_comp
    return list_comp_output


my_def([])
print my_def([x[1] for x in my_list])
[2,4]

此外,我在这里看不出任何合乎逻辑的东西 :) 如果您想使用全局变量,只需定义是否在您的模块范围内(在函数之外并将其传递给您的函数。)

def my_def(list_comp):
    # do stuff with list_comp
    return list_comp_output


my_list= # a costume list 
li=[x[1] for x in my_list]
print my_def(li)

或者更优雅地在你的函数中进行列表理解:

def my_def(list_comp):
    return [x[1] for x in list_comp]

1. Mark Lutz 学习 Python