将列表理解传递给 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
我有一个函数,我想在其中将列表理解作为输入传递给它。我收到有关未定义 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