0

The following is python code, I initialize a 2-d list using operator *, and set the diagonal elements with other value. But get unexpected output.

table = [([False]*5)]*5
for i in range(5):
   table[i][i] = 1

The expected output is

[[True, False, False, False, False],
 [False, True, False, False, False],
 [False, False, True, False, False],
 [False, False, False, True, False],
 [False, False, False, False, True]]

But I got

[[True, True, True, True, True], 
 [True, True, True, True, True], 
 [True, True, True, True, True], 
 [True, True, True, True, True], 
 [True, True, True, True, True]]

May the elements in the list refers one, I guess. How could I get the expected output without using numpy or other packages?

jpp
  • 159,742
  • 34
  • 281
  • 339
wanger
  • 145
  • 1
  • 6

1 Answers1

2

Be explicit in your table construction via nested for loops, otherwise the pointers in your list will all point to a single list. This is why, in your code, assigning one elements affects all elements.

table = [[False for i in range(5)] for j in range(5)]

for i in range(5):
    table[i][i] = True

# [[True, False, False, False, False],
#  [False, True, False, False, False],
#  [False, False, True, False, False],
#  [False, False, False, True, False],
#  [False, False, False, False, True]]

A better idea, if you are happy to use a 3rd party library, is to use a numpy:

import numpy as np

table = np.eye(5).astype(bool)

# array([[ True, False, False, False, False],
#        [False,  True, False, False, False],
#        [False, False,  True, False, False],
#        [False, False, False,  True, False],
#        [False, False, False, False,  True]], dtype=bool)
jpp
  • 159,742
  • 34
  • 281
  • 339