Hi Jiri, On Wed, 10 Aug 2005 11:40:54 +0100, Jiri Barton <[EMAIL PROTECTED]> wrote:
> I have a problem with initialization. >>>> a, b = [[]]*2 >>>> a.append(1) >>>> b > [1] > > Why is this? Why does not this behave like the below: > >>>> a, b = [[], []] >>>> a.append(1) >>>> b > [] In the first case, you make a list containing a single empty list. The "*2" operation duplicates the item in that list. So now both a and b contain the same instance of an empty list. Whereas in the second case, you explicity declare two separate instances of an empty list. The append method modifys the existing list object - it changes the values it holds inside itself. Therefore, in the first example, because a and b both refer to the same object, changing 'a' will will appear to also change 'b'. The same is not true of the second example, because they are different objects. A simpler example: >>> a = [] >>> b = [] >>> c = b Now lets try some tests: >>> a == b True >>> b == c True Ok - so this shows that a and b, and b and c are equal _in the sense that they amount to the same value_. But that doesn't mean they are the same actual object: >>> a is b False >>> b is c True b and c are the same empty list object. But a and b are separate, different, empty list objects. Why the difference? Imagine you made a set of objects to represent some kind of numeric values, eg. vectors. Asking "A==B" means "is the value of the vector A, the same as the value of the vector B". But asking "A is B" means "is the object A the same object as B". >>>> [[]]*2 > [[], []] >>>> [[], []] == [[]]*2 > True Same effect. But try the 'is' operator, to see if they are actually the same instances of 'empty list': >>>> [[], []] is [[]]*2 > True Hope this helps ... its my first go at explaining this kind of stuff, so apologies if it isn't as clear as it could be! Matt -- | Matt Hammond | R&D Engineer, BBC Research and Development, Tadworth, Surrey, UK. -- http://mail.python.org/mailman/listinfo/python-list