Python NameError:在循环内使用functools时发生错误
我有以下代码在类初始化时生成“E NameError:name'local_func'未定义” (这只是一个简单的例子),我做错了什么Python NameError:在循环内使用functools时发生错误,python,python-3.x,functools,Python,Python 3.x,Functools,我有以下代码在类初始化时生成“E NameError:name'local_func'未定义” (这只是一个简单的例子),我做错了什么 from functools import partial def glob_func(a, b, c, x): return 1000 * a + 100 * b + 10 * c + x class MyClass: local_func = partial(glob_func, 3, 1, 4) my_list = [loc
from functools import partial
def glob_func(a, b, c, x):
return 1000 * a + 100 * b + 10 * c + x
class MyClass:
local_func = partial(glob_func, 3, 1, 4)
my_list = [local_func(num)
for num in (
40,
70,
90
)]
注意:下面的程序正在运行。。。为什么不从loop开始
my_list = [local_func(40),
local_func(70),
local_func(90)]
使用类与您在这里尝试的不同 我希望这是您所需要的:
from functools import partial
def glob_func(a, b, c, x):
return 1000 * a + 100 * b + 10 * c + x
local_func = partial(glob_func, 3, 1, 4)
my_list = [(local_func(num)) for num in (40,70,90)]
print my_list
输出:
[3180, 3210, 3230]
使用类与您在这里尝试的不同 我希望这是您所需要的:
from functools import partial
def glob_func(a, b, c, x):
return 1000 * a + 100 * b + 10 * c + x
local_func = partial(glob_func, 3, 1, 4)
my_list = [(local_func(num)) for num in (40,70,90)]
print my_list
输出:
[3180, 3210, 3230]
您得到了上述错误,因为即使您在类中初始化了
local\u func
和my\u list
,但它们仍然可以访问。这可能被认为类似于Python中的函数声明和调用。当你这样做的时候
def sum(a, b):
c = a + b
return c
如果您试图直接打印c,则会出现找不到变量c的错误。这是因为函数还没有被调用,只是被声明了。因此,在函数调用之前无法访问函数的局部变量
类似地,您的类还没有被调用(从技术上讲,是实例化)。因此,您要么访问
local\u func
asMyClass.local\u func
和my\u list
asMyClass.my\u list
,要么简单地删除类声明,如@Siva所示,您将得到上述错误,因为即使您已在类内初始化local\u func
和my\u list
,您也会得到上述错误,但它们仍然可以访问。这可能被认为类似于Python中的函数声明和调用。当你这样做的时候
def sum(a, b):
c = a + b
return c
如果您试图直接打印c,则会出现找不到变量c的错误。这是因为函数还没有被调用,只是被声明了。因此,在函数调用之前无法访问函数的局部变量
类似地,您的类还没有被调用(从技术上讲,是实例化)。因此,您可以访问
local_func
作为MyClass.local_func
和my_list
作为MyClass.my_list
,或者您只需删除类声明,如@Siva所示,与functools部分无关。。。这个问题在这里讨论,对不起
与功能工具不相关。。。这个问题在这里讨论,对不起
谢谢,我本来想把它留在课堂上,但我想这里有一些初始化顺序问题。。。最重要的是,这是可行的:我的列表=[local_func(40),local_func(70),local_func(90)]谢谢,我希望把它留在课堂上,但我认为这里有一些初始化顺序问题。。。最重要的是,这是可行的:我的列表=[local_func(40),local_func(70),local_func(90)]谢谢@Swati,我在原始问题中添加了一个注释,带有一个没有循环的工作示例,我无法解释,你能解释吗?为什么这在循环内部不起作用而在循环外部起作用?问题不在于类还没有被调用,问题在于列表理解创建了一个函数作用域,而类主体不创建封闭作用域。注意,Python没有类声明,类定义语句是在运行时执行的可执行代码。@juanpa.arrivillaga感谢您的宝贵反馈。我会调查并寻找更好的解决方案。@DoronLevi我认为这个问题是juanpa.arrivillaga指定的。列表理解是创建函数作用域,而类主体不创建封闭作用域。因此,问题缩小为“范围”问题。我将很快搜索并尝试提供solution@SwatiSrivastava你在链接的副本中看到接受的答案了吗?它涉及到很多细节以及如何解决这些问题。谢谢@Swati,我在原始问题中添加了一个注释,其中有一个没有循环的工作示例,我无法解释,可以吗?为什么这在循环内部不起作用而在循环外部起作用?问题不在于类还没有被调用,问题在于列表理解创建了一个函数作用域,而类主体不创建封闭作用域。注意,Python没有类声明,类定义语句是在运行时执行的可执行代码。@juanpa.arrivillaga感谢您的宝贵反馈。我会调查并寻找更好的解决方案。@DoronLevi我认为这个问题是juanpa.arrivillaga指定的。列表理解是创建函数作用域,而类主体不创建封闭作用域。因此,问题缩小为“范围”问题。我将很快搜索并尝试提供solution@SwatiSrivastava你在链接的副本中看到接受的答案了吗?它涉及很多细节,以及如何解决。你应该将其标记为重复,而不是将其发布为回答我该如何做@juanpa.arrivillaga?你应该将其标记为重复,而不是将其发布为回答我该如何做@juanpa.arrivillaga?类作用域与列表理解不符,因为列表理解创建函数作用域,但类主体不是封闭作用域,所以局部变量对类主体中定义的函数不可用,就像使用方法时,在不引用类的情况下无法访问类变量一样。只需使用常规的for-loop。类作用域与列表理解不匹配,因为列表理解创建函数作用域,但类主体不是封闭作用域,因此局部变量对在类主体中定义的函数不可用,就像使用方法一样,如果不引用类,就无法访问类变量。只需使用常规for循环。