0

I created a 2 'dimensional' list where each element is None.

listA = [[None] * 8 ] *8

by logic I thought I could access each element individually by choosing between 2 coordinates the horizontal and the vertical one.

listA[y][x]

but I ran into a problem that I can't explain and I would need help the problem is as follows.

We agree that:

[[None] * 8 ] *8 == [[None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None],
                     [None, None, None, None, None, None, None, None]]

The python interpreter returns True.

So if I make :

  ListA = [[None] * 8 ] *8 

And

 ListaB = [[None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None],
              [None, None, None, None, None, None, None, None]]

And after I edit the element in the same position in both lists I will get the same result right ?

ListA[0][0]= 3  
ListaB[0][0]= 3

But strangely at this point the two lists are different :

ListA == ListB

return False

print(ListA) = `

[[3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None], 
                 [3, None, None, None, None, None, None, None]]`

print(ListB) =

[[3, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None],
               [None, None, None, None, None, None, None, None]]

I cannot logically understand why.

to me it look like Python remeber the way listA was constructed and use the same process to update it, if so I am beginning to think that python does not evaluate the expression to be assigned to a variable but assigns the expression to a varible which is quite equivocal if you ask me.

Mezza
  • 23
  • 3
  • 2
    Does this answer your question? [List of lists changes reflected across sublists unexpectedly](https://stackoverflow.com/questions/240178/list-of-lists-changes-reflected-across-sublists-unexpectedly) – Iain Shelvington Dec 23 '22 at 11:30

0 Answers0