简体   繁体   中英

Python creating 2D array

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?

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]]

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM