文章目录
前言
在这里主要讲述python二维列表的创建方法,并不包含第三方库的创建方式,若需第三方库的创建请另外查看其他文件。
一、不同创建方法
(1)二重循环的方法
>>> list=[]
>>> for i in range(6):
... list.append([])
... for j in range(6):
... list[i].append(0)
...
>>> list
[[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, 0]]
(2)二重循环的高级用法
>>> list=[[0 for i in range(6)]for j in range(6)]
>>> list
[[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, 0]]
(3)内嵌乘积的方法
>>> list=[[0]*6]*6
>>> list
[[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, 0]]
(4)单重循环+内嵌乘积
>>> list=[]
>>> for i in range(6):
... list.append([0]*6)
...
>>> list
[[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, 0]]
二、常见问题
内嵌乘积法常见问题
>>> list=[[0]*6]*6
>>> for i in range(6):
... list[i][i]=1
...
>>> list
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
为什么会出现这种情况呢?在这里我们先分别计算一下我们创建的列表所占据的内存大小。
>>> list=[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
>>> for i in range(6):
... print(id(list[i]))
...
1542208065728
1542208002624
1542208003392
1542208003968
1542208003328
1542208002176
>>> list=[[0]*6]*6
>>> for i in range(6):
... print(id(list[i]))
...
2173749779648
2173749779648
2173749779648
2173749779648
2173749779648
2173749779648
看出区别了么?也就是说如果你采用内嵌的方式其实python解释器并没有为它分配空间,你可以将它可以看成一种指针形式,只是告诉python解释器你想要创建一个多大的数组,并没有内容,那该如何解决上述所提的问题呢?
其实只要你采用另外三种方法的任意一种,都可以解决问题,这里就不列举了,读者可以自己去尝试一下。那这种方法有什么用处呢?怎么感觉那么鸡肋呢?在这里小编就提供一种它的优势之处。
恰恰因为这种创建方法没有分配内存,对于数据量比较大的,且不知道具体每行有多少个数据的形式,采用这种方法是有它的绝对优势的。
>>> list=[[0]*6]*6
>>> for i in range(6):
... list[i]=[1,1,1]
...
>>> list
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
看到这里不知道你是否已经明白了呢?也就是说对于不确定的数据量,我们完全可以设置一个足够大的数来创建列表,后续如果对其进行单行处理,便会只占用相应数据量大小的内存,这样对于数据量比较大的项目,可以节省不少空间同时也更易于处理。
>>> list=[[0]*6]*6
>>> list[0]=[1,1,1]
>>> list[1]=[1,2]
>>> list[3]=[2,3]
>>> list
[[1, 1, 1], [1, 2], [0, 0, 0, 0, 0, 0], [2, 3], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
根据这个例子又可以看出什么呢?我们发现未被我们赋值的行,被全部初始化为0了,这是你该说了刚才你不是说了嘛不占内存空间的,现在不是又占了么,这还有什么用!望君莫急,听我徐徐道来。
>>> for i in range(6):
... print(id(list[i]))
...
2173750053696
2173750053248
2173750054848
2173750117696
2173750054848
2173750054848
之后我们对其进行秋id地址,发现未被赋值的行全部都在同一个id地址处,也就是说它并未占据空间,由于你设置的列表大小的限制,python内部还是会根据你设置大小输出,但是还是不会分配内存空间的。
当然一般情况下都是明确矩阵行数的,所以这并不是它的缺点哦!
小编的废话
听完小编的一番讲解你是否学废了呢?如果对你有用的话就请点个赞吧,你的支持就是小编最大的动力!!!