0

我正在用 Python 编写一个空间交易游戏,我决定需要将地图分成更小的块,以减少在任何给定时间在屏幕上绘制时需要考虑的对象数量。

这是通过使用 Sector 对象来处理的,该对象定义如下:

class Sector:
   x=0     #Position of the sector. The galactic (absolute) position of any object is its in-sector position
   y=0     #plus the galactic position offset times the size of a sector. 
   stardict=dict()

然后,生成器代码用 75 颗星填充每个扇区(目前为 100 个),并保存在 stardict 中。

thesector=Sector()

size=size/2

#Generate stars
for t in range(stars):
    #name="Star "+str(t)
    name=generate_name().capitalize()
    thesector.stardict[name]=Star( name, (random.randint(-size,size), random.randint(-size,size)), (random.randint(0,255), random.randint(0,255), random.randint(0,255)), random.randint(3,7))

    if math.floor((t/stars)*100)==(t/stars)*100: print("Generating stars: "+str((t/stars)*100)+"% done.")

但是,在尝试实际运行程序时会出现一些奇怪的错误,使用调试器打开它会显示原因:每个扇区的 stardict 属性是相同的,它们都包含完全相同的星号(不重复,它们具有相同的内存地址) . 据我所知,每个 Sector.stardict 实际上都引用了同一个 dict 对象。

我不知道为什么会这样。任何人都可以对此有所了解吗?

4

1 回答 1

5

它们指的是同一个对象。这是一个非常常见的问题。如果您希望他们每个人都有自己的dict,您需要在__init__方法中创建它。

class Sector:
   x = 0     #Position of the sector. The galactic (absolute) position of any object is its in-sector position
   y = 0     #plus the galactic position offset times the size of a sector. 
   def __init__(self):
       self.stardict = dict()

正如您当前的代码所示,当您尝试访问stardictvia时self.stardict,python 首先stardictinstance上查找,但是当它在那里找不到stardict属性时,它会在class上查找。它stardict在类上找到,所以它使用它。但是,这意味着所有实例都找到相同的stardict(因为它们都是同一类的所有实例)——更新其中一个stardict和所有其他实例都会知道(比光速还快!)*。

*请注意,这不会违反任何物理定律。由于它们是同一个对象,因此信息传播没有距离......

于 2013-03-19T00:41:30.813 回答