[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Referencing instances by memory address



Why are you storing stuff by id() in a dictionary in the first place? When would you want to look something up by it's id() when you wouldn't want just to have a reference (possible a weakref) to the object itself?

(I ask because it seems like doing what you are doing would be a big ol' error prone hassle and waste of your time compared to other more commonly used techniques in python, but I can't figure out exactly what problem that dictionary approach was originally conceived of as a solution for)


On Mon, Jul 12, 2010 at 9:25 AM, éæå <onpon4@xxxxxxxxx> wrote:
In my game that I'm working on, Senso (which is my first game in Pygame), there is a main game class, Game, which handles things on the global level. One thing it does is store each instance of game objects in dictionaries, with the dictionary keys being each instance's memory address, grabbed with id(). When an instance needs to be removed, part of the process involves removing the dictionary reference of the instance, by calling "del game.myclassdict[id(self)]" (replacing "myclassdict" with the actual name of the correct dictionary). This seems to cause a problem: sometimes, this action seems to reference a nonexistant key in the respective dictionary. I've only experienced it with bullets. I've checked and double-checked the code, and it doesn't seem that at any point I forget to add an instance to the dictionary.

This problem has been around in my game for quite a while, but only recently I have been able to consistently replicate it, while I was just messing around with my game. Attached is my game as it is now. To see the error, run senso.py and choose game 4 when prompted. It should happen pretty quickly (in less than a second). Sometimes it takes longer.

Does anyone have any idea why this might happen?

(Also, please let me know if I'm doing something stupid! I won't feel bad! :) )