版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangxy2014/article/details/79301301
前言:
从java到cobol,一直没有把数组的坑填过。
至少现在把python的二维数组的坑填上~~
只要开始,都不算晚
二维数组的创建beginning~
Python中的list、tuple默认都是一维的。
方式一:
lst2 = [1, 2, [3, 4]]
等同于:
lst = [1, 2]
lst.append([3, 4])
print lst
# 输出结果
[1, 2, [3, 4]]
等同于:
lst3 = [1, 2]
lst3.insert(2, [3, 4])
print lst3
注意:
lst = []
lst.append([])
lst[0][0] = 1 # 不论是否有这一句,都会报错
print lst # 不会报错
print lst[0][0] # 编译器报错-->IndexError: list index out of range
如果要给二维数组的第一个元素赋值,需要用append,可以改写为:
lst[0].append(100)
print lst[0][0]
# 输出结果
100
方式二:
创建一个宽度为3,高度为4的数组
[[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0]]
以下A、B哪个是一维数组,哪个是二维数组,^_^
A = [0] * 3 * 4
B = [[0] * 3] * 4
print A
print B
问题:如此创建数组B后,当操作B[0][1] = 2
时,整个第二列都被赋值了。
扫描二维码关注公众号,回复:
3821476 查看本文章
[[0, 2, 0], [0, 2, 0], [0, 2, 0], [0, 2, 0]]
为什么?
原因:list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接(浅拷贝、深拷贝单独写一文)
例1:
lst = [[]] * 3
print lst
lst[0].append(3)
print lst
# 输出结果
[[3], [3], [3]]
[[]]是一个含有一个空列表元素的列表,所以[[]]*3表示3个指向这个空列表元素的引用,修改任何一个元素都会改变整个列表。
例2(类似情况):
A = [3] * 3
B = A
B[0] = 1
print A
print B
# 输出结果
[1, 3, 3]
[1, 3, 3]
所以需要用另外一种方式进行创建二维数组,以免浅拷贝
lst = [[] for i in range(3)]
lst[0].append(3)
lst[0].append(6)
lst[1].append(5)
lst[2].append(9)
print lst
# 输出结果为:
[[3, 6], [5], [9]]
二维数组的创建方式为:*
lst = [[0] * cols for i in range(rows)]
方式三:
lst = []
for i in range(3):
lst.append([])
lst[i].append(i)
print lst
# 输出结果
[[0], [1], [2]]