Python实例化类赋值变量时触发name not defined报错咨询
问题原因分析
你遇到的NameError: name 'period' is not defined报错和构造函数的参数是否设置默认值无关,错误来源于你调用类构造函数时,传入的period、division属于当前作用域未定义的变量。
核心误解说明
你对构造函数默认参数的使用逻辑有偏差:
- 构造函数的形参默认值,生效的前提是调用时不传入对应实参,此时解释器会自动用默认值填充参数,不需要你额外操作。
- 构造函数的形参名只在类的
__init__方法内部的命名空间生效,不能直接作为变量拿到外部当实参传入。
两种写法的报错说明
第一版带默认参数的代码:
你写的stuff = Stuff(period, division)相当于尝试把当前作用域里名叫period、division的变量作为实参传入构造函数,但这两个变量没有提前定义,所以触发NameError。如果你要使用默认参数,直接调用stuff = Stuff()即可,会正常输出1 1。第二版无默认参数的代码:
你调用stuff = Stuff()时触发的不是NameError,而是TypeError: __init__() missing 2 required positional arguments: 'period' and 'division',属于参数数量不匹配的报错,和第一版的错误类型完全不同。
符合你需求的正确写法
你不需要提前定义参数变量,调用时直接传入字面量即可:
class Stuff(): def __init__(self, period = 1, division = 1): print(str(period), str(division)) # 直接传自定义字面量,无需提前定义变量 stuff = Stuff(3, 6) # 也可以用关键字参数传值 stuff = Stuff(period=5, division=10)
如果参数值需要运行时动态获取,只需要在调用前先拿到对应值再传入即可,这是Python作用域的基础规则。
内容的提问来源于stack exchange,提问作者coinmaster
相关产品推荐
相关产品推荐

