Python创建二维数组实例(关于list的一个小坑)
0.目录
1.遇到的问题
2.创建二维数组的办法
•3.1直接创建法
•3.2列表生成式法
•3.3使用模块numpy创建
1.遇到的问题
今天写Python代码的时候遇到了一个大坑,差点就耽误我交作业了。。。
问题是这样的,我需要创建一个二维数组,如下:
m=n=3 test=[[0]*m]*n print("test=",test)
输出结果如下:
test=[[0,0,0],[0,0,0],[0,0,0]]
是不是看起来没有一点问题?
一开始我也是这么觉得的,以为是我其他地方用错了什么函数,结果这么一试:
m=n=3 test=[[0]*m]*n print("test=",test) test[0][0]=233 print("test=",test)
输出结果如下:
test=[[0,0,0],[0,0,0],[0,0,0]] test=[[233,0,0],[233,0,0],[233,0,0]]
是不是很惊讶?!
这个问题真的是折磨我一个中午,去网上一搜,官方文档中给出的说明是这样的:
Notealsothatthecopiesareshallow;nestedstructuresarenotcopied.ThisoftenhauntsnewPythonprogrammers;consider:
>>>lists=[[]]*3 >>>lists [[],[],[]] >>>lists[0].append(3) >>>lists [[3],[3],[3]]
Whathashappenedisthat[[]]isaone-elementlistcontaininganemptylist,soallthreeelementsof[[]]*3are(pointersto)thissingleemptylist.Modifyinganyoftheelementsoflistsmodifiesthissinglelist.Youcancreatealistofdifferentliststhisway:
>>> >>>lists=[[]foriinrange(3)] >>>lists[0].append(3) >>>lists[1].append(5) >>>lists[2].append(7) >>>lists [[3],[5],[7]]
也就是说matrix=[array]*3操作中,只是创建3个指向array的引用,所以一旦array改变,matrix中3个list也会随之改变。
2.创建二维数组的办法
2.1直接创建法
test=[0,0,0],[0,0,0],[0,0,0]]
简单粗暴,不过太麻烦,一般不用。
2.2列表生成式法
test=[[0foriinrange(m)]forjinrange(n)]
学会使用列表生成式,终生受益。不会的可以去列表生成式-廖雪峰的官方网站学习。
2.3使用模块numpy创建
importnumpyasnp test=np.zeros((m,n),dtype=np.int)
关于模块numpy.zeros的更多知识,可以去python中numpy.zeros(np.zeros)的使用方法看看。
以上这篇Python创建二维数组实例(关于list的一个小坑)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。