classification
Title: Lists: [[0]*N]*N != [[0 for _ in range(N)] for __ in range(N)]
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: darrell, ezio.melotti, loewis, ubershmekel
Priority: normal Keywords:

Created on 2012-05-04 04:13 by darrell, last changed 2012-05-04 06:45 by ezio.melotti. This issue is now closed.

Files
File name Uploaded Description Edit
Screen Shot 2012-05-03 at 9.05.59 PM.png darrell, 2012-05-04 04:13
Messages (4)
msg159899 - (view) Author: Darrell Long (darrell) Date: 2012-05-04 04:13
N = 5
board_1 = [[0 for _ in range(N)] for __ in range(N)]

is not the same as:

board_2= [[0]*N]*N

One makes a proper list of lists (the first), the second makes a new kind of animal were board_2[1][1] = 99 changes a whole column.

Oddly, testing board_1 == board_2 is True!

I'm teaching Python to non-majors, and this is a tough one to explain.
msg159902 - (view) Author: Yuval Greenfield (ubershmekel) * Date: 2012-05-04 06:06
This isn't a bug and should be closed. It's more of a stack overflow question.

If you'd like to change this fundamental behavior of a very common operation in python you should make a proposal to the python ideas mailing list at http://mail.python.org/mailman/listinfo/python-ideas

In your example board_2 is equivalent to:

    row = [0] * N
    board_2 = row * N

All the rows are the same initial row. As opposed to board_1 where each row is a new row.

Try this:

    [id(i) for i in board_2]

The initial equivalence is because they do represent the same values (NxN list of all zeroes). What should python compare if not by values?
msg159903 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2012-05-04 06:18
It's actually fairly easy to explain. Just think about it harder (and consider Yuval's explanation).
msg159906 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2012-05-04 06:45
http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list
http://python.net/crew/mwh/hacks/objectthink.html
History
Date User Action Args
2012-05-04 06:45:00ezio.melottisetnosy: + ezio.melotti

messages: + msg159906
stage: resolved
2012-05-04 06:18:54loewissetstatus: open -> closed

nosy: + loewis
messages: + msg159903

resolution: not a bug
2012-05-04 06:06:19ubershmekelsetnosy: + ubershmekel
messages: + msg159902
2012-05-04 04:15:56darrellsettype: behavior
2012-05-04 04:13:41darrellcreate