构造函数新增可选参数from_strings是否需设置默认值?
Python构造函数可选参数的正确写法分析
先直接给结论:你给出的两种写法都存在问题,需要调整成更安全合理的写法才能满足需求。
第一种写法
def __init__(self, size=19, from_strings):语法错误
Python明确规定,带默认值的参数必须放在无默认值参数的后面,否则解释器会直接抛出语法错误。这里size有默认值,from_strings没有,顺序不符合规则,根本无法运行。第二种写法
def __init__(self, size=19, from_strings=[]):语法合法但隐藏陷阱
Python的默认参数是在函数定义时就完成初始化的,用列表这类可变对象作为默认值,会导致所有Board实例共享同一个列表。如果某个实例修改了from_strings,其他实例的该参数也会跟着变化,这显然是不符合预期的。
正确实现方式
要支持b = Board(3, ["O.O", ".@.", "@O."])这类调用,同时规避上述问题,应该把默认值设为None,再在函数内部初始化空列表:
class Board: def __init__(self, size=19, from_strings=None): # 未传入from_strings时,初始化独立的空列表 if from_strings is None: from_strings = [] # 后续业务逻辑,比如赋值实例属性 self.size = size self.from_strings = from_strings
这种写法的优势:
- 语法合规,完全支持你需要的调用方式,传入的
3会赋值给size,列表会赋值给from_strings。 - 每个实例的
from_strings都是独立的,不会出现多个实例共享同一可变对象的问题。
内容的提问来源于stack exchange,提问作者Anne_Music
相关产品推荐
相关产品推荐

