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

Re: [pygame] Sprite Collision



Kris Schnee wrote:
> Aha! I've seen a problem like this before. I called it the "stripey doom
> error," because when I did a tile-based game and changed one element,
> I'd see a whole stripe of tiles change instead of one. Python has other
> "sticky variable" problems sometimes if you don't think carefully about
> whether something is a reference to another variable. I would sometimes
> end up changing "constants" and having other problems.

This has happened to me too and "stripey doom error" is a great name
for it :).

> When all else fails, copy.deepcopy() seems to make Python understand, "I
> want this to have _the same value_ as X now has, not to be a _reference_
> to X."

When I was learning C++, and being taught how to write classes, we
were taught that some copies are shallow, and some copies are deep,
like with copy.deepcopy. A shallow copy is one that only copies one
level of stuff. So, for example:

>>> l = [1, 'a', {}]
>>> l2 = l[:]    # make a shallow copy
>>> l
[1, 'a', {}]
>>> l2
[1, 'a', {}]
>>> l2 [1] = 'b'
>>> l
[1, 'a', {}]
>>> l2
[1, 'b', {}]

l2 is a copy of l, and I can change it separately. But the elements of
l2 are the same as the elements in l (the same objects, not a copy) so
if I change the dictionary:

>>> l2[-1]['a'] = 4
>>> l2
[1, 'b', {'a': 4}]
>>> l
[1, 'a', {'a': 4}]

... it changes in both. That's OK for your coords example, for
instance, because you aren't changing the integers (integers are
immutable), but changing the list that has those integers.

By comparison:

>>> l = [1, 'a', {}]
>>> l2 = copy.deepcopy(l)
>>> l2[-1]['a'] = 4
>>> l
[1, 'a', {}]
>>> l2
[1, 'a', {'a': 4}]

For lists, you can use the [:] syntax, which creates a slice of the
whole object, to get a shallow copy. You can also use functions like:

copy_of_coords = list(coords)
copy_of_d = dict(d)

The code that generates "stripey doom errors" isn't really creating a
copy of the rows, but repeating the same row, so it isn't even a
shallow copy.

I hope this is useful! The problem, the symptoms and the solution have
already been posted but I thought I would add some Computer Science
Lore to spice things up a bit.

Ethan

Attachment: signature.asc
Description: OpenPGP digital signature