将List Comprehension传递给Python中的函数

时间:2015-06-18 14:21:01

标签: python python-2.7 list-comprehension

我有一个函数,我希望将列表理解作为输入传递给我。我收到的关于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])

2 个答案:

答案 0 :(得分:1)

实际上我们在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):
    # 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

答案 1 :(得分:0)

那是因为没有定义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]