tuples and cartesian coordinates

Peter Otten __peter__ at web.de
Wed Dec 17 23:14:29 CET 2003


Gerrit Holl wrote:

> the FAQ says:
> 
>> For example, a Cartesian coordinate is appropriately represented as a
>> tuple of two or three numbers.
> 
> I find it strange to use tuples for a coordinate. After all, a
> coordinate represents a position of an object. Suppose I have a game
> where the player has a position: isn't it stupid to use tuples rather
> than lists or another type (maybe complex numbers?), because I want to
> be able to change the position?
> 
> Shouldn't coordinates be mutable?

One benefit of immutable coordinates: you can safely assign one coordinate
to multiple positions:

class Shape: pass
s1 = Shape()
s2 = Shape()

origin = ImmutableCoord(0, 0)
s1.position = origin
s2.position = origin

Whereas with mutable coordinates you would need

class Shape:
    def __init__(self, pos):
        self.pos = MutableCoord(pos)
    def setPosition(self, pos)
        self.pos.x = pos.x
        self.pos.y = pos.y
s1.setPosition(origin)
s2.setPosition(origin)

There are several variants of this scheme, but I think they all tend to
complicate the design, because not only rebinding of pos needs to be
tracked, but also the changing of pos.x and pos.y.

By the way, complex numbers are immutable:

>>> z = 1 + 3j
>>> z.imag = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: readonly attribute

Peter




More information about the Python-list mailing list