Python类初始化方法字典默认值设置遇NameError问题求助
解决NameError与Python类默认参数的陷阱
首先看你触发的NameError——问题非常直接:你在默认字典里写的black、white、red没有被定义成变量,Python会把它们当作标识符去查找,但你其实是想把它们作为字符串键来用,所以必须给这些键加上引号。
另外还有一个容易踩的Python坑:不要用可变对象(比如字典、列表)作为函数/方法的默认参数。因为默认参数是在函数定义时创建的,而不是每次调用时生成,后续如果修改了self.colors_dict,会意外改变这个默认字典,影响后续的实例化操作。
修正后的代码如下:
class PaintWindow: def __init__(self, display_height, display_width, colors_dict=None): # 处理默认参数,避开可变对象的陷阱 if colors_dict is None: colors_dict = { 'black': (0, 0, 0), 'white': (255, 255, 255), 'red': (255, 0, 0) } self.display_height = display_height # 原代码写死了800,这里改成用传入的参数,如果你确实要固定尺寸可以改回去 self.display_width = display_width # 同理,原代码写死了600,建议匹配传入值 self.colors_dict = colors_dict
额外说明:
- 给字典键加上引号后,Python就会把它们当作字符串处理,不会再去查找对应的变量,
NameError就解决了。 - 将默认参数设为
None,再在方法内部创建默认字典,这样每次实例化时如果没传colors_dict,都会生成一个全新的字典,彻底避免了可变默认参数的副作用。
内容的提问来源于stack exchange,提问作者harshtiwari
相关产品推荐
相关产品推荐

