Issue 12951: List behavior is different (original) (raw)

URL: http://docs.python.org/library/stdtypes.html

Following example is given.

lists = [[]] * 3 lists [[], [], []] lists[0].append(3) lists [[3], [3], [3]]

Behavior is as follows.

a = [[]] * 3 a [[], [], []] a[0] = 1 a [1, [], []]

Python interpreter details:

$ python Python 2.7.2 (default, Aug 22 2011, 13:53:27) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information.

I don't see where is the bug. If you do

lists = [[]] * 3 lists [[], [], []]

you are creating a list that contains 3 references to the same list, as you can see here:

lists[0] is lists[1] is lists[2] True [id(l) for l in lists] [33714832, 33714832, 33714832]

so if you append an element to either of the inner list, it will show up 3 times, because the 3 lists are really the same object:

lists[0].append(3) lists [[3], [3], [3]]

However, if you do

lists[0] = 1 lists [1, [3], [3]]

you are replacing the first element of 'lists' with the int 1. This doesn't mutate the inner list, and therefore the second and third elements are not affected.

See also http://python.net/crew/mwh/hacks/objectthink.html