python基础01-定义⼆维数组
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)
java定义一维数组并赋值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 =[[0for 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)
不管哪种枚举⽅法,只要每个元素都是现场输⼊或⽣成的,⽽不是依据其他已有数据来⽣成的,那就都是值赋值,后续⼤部分操作的结果也都会是符合直观思维的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论