You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:25:30