终于知道python如何定义二维数组


核心提示:一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此python允许构造多维数组。

一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此python允许构造多维数组。那么python如何定义二维数组呢?一起来了解下吧:

python如何定义二维数组

>>> A = [0]* 3 * 4

>>> B = [[0]*3] * 4

是A还是B呢?当然是B了!还是先输出看一下:

>>> A

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

>>> B

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

不出所料,我们应该按照B = [[0]*3]*4来创建二维数组。

!!!!!!!!BUT!!!!!!!!!

当你按照上述方式来创建二维数组的时候,如果你对二维数组中的一个数进行改变,会输出什么呢?我们来试一下,比如我们把第一行的第二个数字改为2,B[0][1] = 2,输出:

>>> B

[[0, 2, 0], [0, 2, 0], [0, 2, 0], [0, 2, 0]]

为什么会是这样?!!

因为list在Python中是个可变类型啊亲!按照B = [[0]*3]*4来创建二维数组只是4个指向这个空列表元素的引用,修改任何一个元素都会改变整个列表的。

另一个栗子:

>>> A = [0]*3

>>> B = A

>>> B[0] = 1

>>> A

[1, 0, 0]


所以,在Python中创建二维数组应该这样写:

>>> C = [[0]*3 for i in range(4)]

>>> C

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

>>> C[0][1] = 2

>>> C

[[0, 2, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

所以下次在Python中创建二维数组时候记住了:

aList = [[0] * cols for i in range(rows)]

python如何创建二维数组

创建一个宽度为3,高度为4的数组

[[0,0,0],

[0,0,0],

[0,0,0],

[0,0,0]]

myList = [[0] * 3] * 4

但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成

[[0,1,0],

[0,1,0],

[0,1,0],

[0,1,0]]

为什么?

答案:list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接

例:

>>> lists = [[]] * 3

>>> lists

[[], [], []]

>>> lists[0].append(3)

>>> lists

[[3], [3], [3]]

[[]]是一个含有一个空列表元素的列表,所以[[]]*3表示3个指向这个空列表元素的引用,修改任何一个元素都会改变整个列表

所以需要用另外一种方式进行创建多维数组,以免浅拷贝:

>>> lists = [[] for i in range(3)]

>>> lists[0].append(3)

>>> lists[1].append(5)

>>> lists[2].append(7)

>>> lists

[[3], [5], [7]]

二维数组创建方式修改为:*

myList = [([0] * 3) for i in range(4)]

python二维数组怎么创建

(1) 暴力创建

mylist = [[0,0,0],

[0,0,0],

[0,0,0],

[0,0,0]]

(2)函数创建

def getMatrix(rows,cols):

matrix = [[0 for col in range(cols)] for row in range(rows)]

for i in range(rows):

for j in range(cols):

print matrix[i][j],

print 'n'

(3) 快速创建

myList = [([0] * 3) for i in range(4)]#初始化为0

myList = [([] * 3) for i in range(4)]#初始化为空

错误创建:myList = [[0] * 3] * 4

原因:*4只是把一维数组复制了四次引用。如果修改mylist[0][1]的值,mylist[2][1]、mylist[3][1]、mylist[4][1]的值都会变。

(4)定义一个嵌套的list表示一个二维数组,并初始化为这样:

score = [[0]*3, [0]*3,[0]*3]

print score

这样在循环外就能方便的访问每个元素了。

python定义二维数组的方法

直接定义:

a=[[1,1],[1,1]]

这里定义了一个2*2的,且初始为0的二维数组。

间接定义:

a=[[0 for x in range(10)] for y in range(10)]

这里定义了10*10初始为0的二维数组。

还有更简单的字义二维数组的方法:

b = [[0]*10]*10

定义10*10初始为0的二维数组。

与a=[[0 for x in range(10)] for y in range(10)]比较:print a==b的结果为True。

但用b的定义方法代替a后,以前的可以正常运行的程序也出错了,经过仔细分析得出区别:

a[0][0]=1时,只有a[0][0]为1,其他全为0。

b[0][0]=1时,a[0][0],a[1][0],只到a[9,0]全部为1。

由此得到大数组中的10个小的一维数据全是一个相同的引用,即指向同一地址。

故 b = [[0]*10]*10并不符合我们常规意义上的二维数组。