Python Forum

Full Version: 2d Array adds last element to entire list
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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
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!
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]]