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

在Python中将列表理解传递给函数,python,python-2.7,list-comprehension,Python,Python 2.7,List Comprehension,我有一个函数,我想将列表理解作为输入传递给。我得到一个关于我的_列表未定义的错误。我知道我可以将my_list放在函数之外,但实际上,该列表是作为函数的一部分生成的 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) 实际定义很复杂,因此这里

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

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):
    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
是此函数中的全局范围的符号。第二个表示将值
[[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]
此外,我在这里看不到任何合乎逻辑的东西:)如果要使用全局变量,只需在模块的范围内定义if(在函数外面,并将其传递给函数)

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

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

1.MarkLutz学习Python

[x[1]代表我的列表中的x]
是一个列表理解,它生成一个列表,该列表(而不是理解)被传递给函数。因此,您的简化函数返回输入列表并修改
my_list
当调用
my_def([x[1]表示my_list中的x])
时,python将计算表达式
[x[1]表示my_list中的x]
并将结果传递给
my_def
<调用函数时需要定义代码>我的列表。。。此外,结果是静态的,因此即使您更改
my_list
它也不会更改,如果您的最终目标是创建一个将某种函数(如lambda x:x[1])应用于列表的所有元素的函数。。。它已经存在,称为mapping=>see
map
function
my_def
在这里只是一个过于冗长的标识函数。您向它传递一个列表,它返回相同的列表。“函数定义中的代码在函数实际被调用之前不会执行”-但更重要的是,函数的参数在函数被调用之前进行求值。这回答了问题,但我猜有更好的方法来做OP想要做的事情(我不清楚那是什么)@JulienSpronck是的,我确实是这么做的;)@Kasra这确实满足了我的需要。我不想在函数中使用列表comp,因为我多次调用该函数,每次都想使用不同的列表comp。@user2242044好的,但为什么要在函数中定义
my_list
?@kasra我认为我的示例过于简化了。该函数用于命中API并返回一些结果<代码>我的列表是API查询的结果。我多次调用该函数以从API获取各种数据。