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