Python 2.7 创建二维数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 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时,整个第二列都被赋值了。

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

ps:官方解释:https://docs.python.org/2.7/library/index.html

猜你喜欢

转载自blog.csdn.net/liangxy2014/article/details/79301301
今日推荐