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