Python Forum
2d Array adds last element to entire list - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: 2d Array adds last element to entire list (/thread-31047.html)



2d Array adds last element to entire list - waiteup - Nov-19-2020

Good Afternoon!

First time poster!

I keep running into this simple problem when trying to fill my 2d array from my SQL. For some reason it will not store the values into my variables. I am really not too sure what else to do here? It seems painfully obvious and is probably staring at me right in the face.


Here is my function -

def GetPlayerData(conn,cur):
    
    rows, cols = (6, 6)
    Players = [[0]*cols]*rows
    
    
    cur.execute('SELECT * FROM Players')
      
    for x in range (1,6):
        nextline = cur.fetchone()
        Players[x][0]= nextline['Players']
        Players[x][1]= nextline['Total_Cash']
        Players[x][2]= nextline['Risk_Level']
        print(Players[x][0])
        
    print(Players[2][2])

    return Players
My first print(Players[x][0]) Displays the entire list as it cycles through x.
My second print(Players[2][2]) shows the last 'players' in the list. every single players[1-5] is stored as the last item in my database.

Thank you


RE: 2d Array adds last element to entire list - waiteup - Nov-19-2020

After looking at the screen for 4 hours, I came to the realization that I was making 5 different arrays and I could just use

Player = {}
Player[1,0] instead of Player [1][1]
Thanks guys!


RE: 2d Array adds last element to entire list - bowlofred - Nov-19-2020

Your initial problem was that you were not making different lists, but just several copies of one list. The construction: [[]] * num takes the inside list and makes num references to it, but they're all the same list. So each time through was overwriting the previous trips through the loop.

>>> players = [[0] * 4] * 3
>>> players
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> players[0][1] = "x"
>>> players
[[0, 'x', 0, 0], [0, 'x', 0, 0], [0, 'x', 0, 0]]
For this to work, you'd need to make different lists.

>>> players = [[0] * 4 for x in range(3)]
>>> players
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> players[0][1] = "x"
>>> players
[[0, 'x', 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]