有趣的二维数组,对于初学python的人的确有一定的迷惑性(就是我。。)
看代码:
a=[]
b=[]
for i in range(5):
a.append(b)
a[0]=1
a[1].append(2)
a[2].append(3)
print(a)
out:
[1, [2, 3], [2, 3], [2, 3], [2, 3]]
代码创建一个二位数组,但当我们为a[1]添加数字2时,发现所有的都被改变,即添加了一个2,接下来添加一个3,同样也被添加到了所有下标中.
通过官方文档(如何创建多维列表?):
https://docs.python.org/zh-cn/3/faq/programming.html#faq-multidimensional-list
也就是说 修改 b中的任何一个元素实际上都是对这一个空列表的修改,都是对b进行操作,在python中万物皆对象,可以根据内存地址更好的了解。
print(id(b))
print(id(a[1]))
print(id(a[2]))
print(id(a[3]))
out:
1884645897160
1884645897160
1884645897160
1884645897160
可以看出b和a[1],a[2],a[3]的内存地址一样,也就是说只是进行在b上的操作,保存在了b的内存地址。除了a[0]被赋值,其余的只是在相同的b上进行操作。b在一开始定义列表,分配其内存空间,并且列表是可变数据类型。换言之,这样只是列表a套列表b。
可以使用列表推导式创建二维数组:
list=[]
list = [[] for i in range(3)]
list[0].append(3)
list[1]=2
print(list)
out:
[[3], 2, []]
也可以使用numpy:
import numpy
num_list = numpy.zeros((2,2))
print(num_list)
num_list[0][0]=1
print(num_list)
out:
[[0. 0.]
[0. 0.]]
[[1. 0.]
[0. 0.]]