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

Python继承使用问题:太阳地球模型中父类异常联动排查

问题分析与解决方案

嘿,我一眼就揪出问题所在啦!你碰到的是Python里可变对象引用共享的经典新手坑,咱们一步步拆解:

为什么太阳会跟着地球转?

你创建sun和earth时,都传入了同一个列表center_screen:

sun = Star(center_screen, 20, (255, 255, 0))
earth = Planet(center_screen, 10, (0, 0, 255), 2, 100)

在Python中,列表是可变对象——当你把它作为参数传递时,传递的不是列表的副本,而是它在内存中的引用。这就意味着sun.location和earth.location指向的是同一个列表!

当地球的set_pos方法修改self.location的值时:

self.location[0] = int(self.r*cos(self.alpha)) + center_x
self.location[1] = int(self.r*sin(self.alpha)) + center_y

其实是在修改那个共享的center_screen列表,太阳的位置自然也会跟着变,看起来就像太阳在追着地球跑。

怎么修复?

只需要让每个实例拥有独立的location列表就行,两种简单方法任选:

方法1:在父类Star中创建列表副本(推荐)

这是最稳妥的方式,能确保所有继承Star的子类都自动拥有独立的位置:

class Star(object):
    def __init__(self, location, size, color):
        # 创建传入列表的副本,彻底切断引用共享
        self.location = location.copy()  # 也可以写成 self.location = list(location)
        self.size = size
        self.color = color

方法2:创建实例时手动传入副本

如果不想修改Star类,也可以在创建对象时主动传副本:

sun = Star(center_screen.copy(), 20, (255, 255, 0))
earth = Planet(center_screen.copy(), 10, (0, 0, 255), 2, 100)

额外小优化

你的set_pos方法里self.alpha += 1可以改成self.alpha += self.speed,这样你定义的speed参数才会真正生效,不然现在地球的转速是固定的1,speed=2根本没起到作用哦~

修改后运行代码,太阳就会稳稳待在屏幕中心,地球乖乖绕着它转啦!

内容的提问来源于stack exchange,提问作者Dan Shorla Ki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:28:48