为什么这段Python代码中多个Shape实例的pos属性引用同一CPoint对象
问题原因
Python的函数默认参数仅在函数定义阶段被求值一次,而非每次调用函数时重新计算。
你在定义Shape.__init__时就执行了CPoint()创建了一个点位实例,后续所有没有显式传入pos参数创建的Shape对象,都会共用这个提前创建好的CPoint实例。因此修改任意一个未传pos的Shape的位置时,其他同批次创建的实例的位置也会同步变化,才会出现你看到的结果偏差。
解决方法
将pos的默认值改为None,在__init__内部判断如果没有传入pos参数,再创建新的CPoint实例,保证每个实例的点位都是独立的:
class Shape: def __init__(self, color = "yellow", filled = True, pos = None): self.__color = color self.__filled = filled # 仅在未传入pos时新建CPoint实例,每次调用都会生成独立对象 self.__pos = pos if pos is not None else CPoint() # 其余方法保持不变即可
修改后运行代码,输出就会和预期一致。
内容的提问来源于stack exchange,提问作者milk_beat
相关产品推荐
相关产品推荐

