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.
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?