自学深度学习重拾python,发现自学打的基础就是不行,比如python中定义二维数组的问题,很怪,也很有意思。
找到了一篇大佬的文章:https://www.cnblogs.com/woshare/p/5823303.html ,茅塞顿开,本文章主要在大佬文章的基础上附带一些具体代码,在值赋值和地址赋值之间做一下比较。

1、python创建二维数组的基本写法
首先要知道python中常用的一种与C、Java不太一样的数组升维写法:
比如已知一个一维数组array01(也就是一个向量),想要写一个二维数组matrix01(也就是一个矩阵),使其每行都是已知的那个向量,可以这么写:

array01 = [0, 0, 0]
# 基本写法1
matrix01_01 = array01*3
# 基本写法2
matrix01_02 = [array01]*3

print("matrix01_01:")
print(matrix01_01)
print("matrix01_02:")
print(matrix01_02)

输出如下:
在这里插入图片描述
这两种写法除了看起来的维度区别之外还有一个本质区别:前者是值赋值,后者是地址赋值
例如对matrix01_01和matrix01_02分别进行修改元素的操作:

matrix01_01[1] = 1
print("new matrix01_01:")
print(matrix01_01)
print("new array01:")
print(array01)

在这里插入图片描述
可见改变的只有matrix01_01中的值,array01中的值是不变的,因此matrix01_01 = array01*3这种创建二维数组的方式是值赋值,将array01中元素的数值复制一遍存入matrix01_01。也就是说matrix01_01中的元素和array01中的元素虽然数值相同,但却是存在于不同地址中的不同数据,使用这个方法是在array01的内存以外划分了新的内存给了新的数组matrix01_01,因此修改matrix01_01中的元素不会影响array01中的元素。

matrix01_02[0][1] = 1
print("new matrix01_02:")
print(matrix01_02)
print("new array01:")
print(array01)

在这里插入图片描述
此时就发生了奇怪的问题:看似只修改了matrix01_02第一行的第二个元素,但结果却是matrix01_02每一行的第二个元素都发生了改变,同时可以观察到作为matrix01_02复制的“模板”的array01也发生了改变,这就说明matrix01_02 = [array01]*3这种方法是地址赋值,也就是说使用这个方法时并没有在array01的内存以外划分新的内存给予matrix01_02,甚至可以说matrix01_02根本就不存在于内存中,每次调用matrix01_02时只是将array01重复调用了三次,因此修改matrix01_02中的元素其实就是直接修改array01中的元素,打印修改后的matrix01_02就是将修改后的array01重复打印三次,故而出现上图的情况。

2、枚举
说到创建数组那怎么能不说一下枚举各个元素的创建法呢。枚举是最基本的创建数组方法,而且因为是值赋值且不依据其他数据,所以后续操作也基本不会出现什么奇怪的问题。就是一个个手敲元素有点烦。
比如创建一个3*3的零矩阵后修改某元素的值:

# 普通枚举
matrix03 = [[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]]
print("matrix03:")
print(matrix03)
matrix03[0][1] = 1
print("new matrix03:")
print(matrix03)

在这里插入图片描述
十分直观、简便。
但是一个个手敲元素确实烦,但得益于python特殊的循环函数range(),对于一些规律性强的矩阵,枚举法创建很方便,例如还是创建一个3*3的零矩阵,用range()就可以这么写:

matrix04_01 = [[0 for i in range(3)]for i in range(3)]
print("matrix04_01:")
print(matrix04_01)
matrix04_01[0][1] = 1
print("new matrix04_01:")

在这里插入图片描述
当然range()也可以用出其他的花样:

matrix04_02 = [[i for i in range(3)]for i in range(3)]
print("matrix04_02:")
print(matrix04_02)
matrix04_02[0][1] = 9
print("new matrix04_02:")
print(matrix04_02)

在这里插入图片描述
不管哪种枚举方法,只要每个元素都是现场输入或生成的,而不是依据其他已有数据来生成的,那就都是值赋值,后续大部分操作的结果也都会是符合直观思维的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐