Rotwang <sg...@hotmail.co.uk> writes: > Hi all, I've been trying to make a class with which to manipulate > sound data, and have run into some behaviour I don't understand which > I hope somebody here can explain. The class has an attribute called > data, which is a list with two elements, one for each audio channel, > each of which is a list containing the audio data for that channel. It > also has various methods to write data such as sine waves and so on, > and a method to insert data from one sound at the start of data from > another. Schematically, the relevant bits look like this: > > class sound: > def f(self): > self.data = [[0]]*2 > > def insert(self, other): > for c in xrange(2): > self.data[c][0:0] = other.data[c] > > However, the insert method doesn't work properly; x.insert(y) adds two > copies of y's data to the start of x's data, instead of one. From a > session in IDLE: > >>>> x = sound() >>>> y = sound() >>>> x.f() >>>> y.f() >>>> x.data > [[0], [0]] >>>> x.insert(y) >>>> x.data > [[0, 0, 0], [0, 0, 0]] > > But suppose I replace the line > > self.data = [[0]]*2 > > with > > self.data = [[0] for c in xrange(2)] > > Then it works fine: > >>>> x = sound() >>>> y = sound() >>>> x.f() >>>> y.f() >>>> x.data > [[0], [0]] >>>> x.insert(y) >>>> x.data > [[0, 0], [0, 0]] > > Can anybody tell me what's going on?
It's a FAQ! http://www.python.org/doc/faq/programming/#how-do-i-create-a-multidimensional-list -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list