Home > Net >  Python creating 2D array
Python creating 2D array

Time:02-01

num1 = [1,2,3,4,5]
num2 = [1,2,3,4,5]

arr1 = [[0]*(len(nums2) 1)]*(len(nums1) 1)
arr2 = [[0 for _ in range(len(nums2) 1)] for _ in range(len(nums1) 1)]
  

I get a different answer when I define arr1 and arr2. Aren't arr1 and arr2 create the same 2D array?

CodePudding user response:

They are not the same. arr1 is a list with (len(nums1) 1) references to the same list [0]*(len(nums2) 1). So when you modify an element in one of them, all references will see this change as well.

For example,

>>> arr1[0][0]  = 1
>>> print(arr1)
[[1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0]]

arr2 doesn't suffer from this problem because it has len(nums1) 1 distinct lists:

>>> arr2[0][0]  = 1
>>> print(arr2)
[[1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]

CodePudding user response:

A better way to see the difference is to use a random number to fill the entries.

from random import randrange

num1 = [1,2,3,4,5]
num2 = [1,2,3,4,5]

arr1 = [[randrange(10)]*(len(nums2) 1)]*(len(nums1) 1)
arr2 = [[randrange(10) for _ in range(len(nums2) 1)] for _ in range(len(nums1) 1)]

print(arr1)
print(arr2)

The output is:

[[5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5]]
[[7, 4, 2, 4, 0, 3], [7, 5, 1, 0, 1, 7], [4, 4, 1, 0, 2, 1], [2, 3, 6, 2, 6, 7], [6, 6, 6, 0, 3, 3], [0, 4, 5, 0, 6, 6]]

You can see that for the arr1, it populates every entry with the same number; while for arr2, the entries are all truly random. This is because arr1 is constructed by expanding a list of just one number, which is [5] here.

  •  Tags:  
  • Related