Python函数向类传变量报NameError: var1未定义的原因及解决
错误原因与解决方法
错误原因
你写的print_it类的__init__方法里直接引用了var1和var2,但这两个变量是yolo函数里的局部变量,类的初始化方法无法直接访问函数内部的局部变量——除非你把这些变量作为参数传递给类的构造方法,并且在__init__里正确接收。
另外你虽然给__init__加了*args参数,但根本没用到它,等于白传了参数,自然找不到变量。
解决方法
方法1:构造方法直接接收参数(推荐)
修改类的__init__,明确接收需要的变量,赋值给实例属性并使用:
class print_it(): def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 print(str(self.var1), str(self.var2)) def yolo(): var1 = 1 var2 = 2 print_it(var1, var2) # 直接传变量给类的构造方法 yolo()
这样调用时把函数里的局部变量传给类的构造方法,__init__就能拿到值,不会报错。
方法2:实例化后通过方法设置属性
如果不想在实例化时就传参数,可以给类加一个设置属性的方法,先创建实例,再调用方法传递变量:
class print_it(): def set_vars(self, var1, var2): self.var1 = var1 self.var2 = var2 print(str(self.var1), str(self.var2)) def yolo(): var1 = 1 var2 = 2 pr = print_it() pr.set_vars(var1, var2) # 调用方法传递变量 yolo()
这种方式适合需要延迟设置变量的场景。
关于全局变量的问题
你说全局变量方案无法获取新值,是因为如果在函数里修改全局变量,需要用global声明,比如:
var1 = 0 var2 = 0 class print_it(): def __init__(self): print(str(var1), str(var2)) def yolo(): global var1, var2 # 声明要修改全局变量 var1 = 1 var2 = 2 print_it() yolo()
但不推荐用全局变量,因为多个函数修改全局变量容易导致逻辑混乱,维护起来麻烦。
为什么把类放函数里能运行?
因为把类定义在函数内部时,类的__init__方法处于函数的作用域内,能直接访问函数里的局部变量,但这样每次调用函数都会重新定义一次类,完全没必要,反而影响性能。
内容的提问来源于stack exchange,提问作者Yolo Yolovich
相关产品推荐
相关产品推荐

