在python中有个特殊的符号“*”,可以用做数值运算的乘法算子,也是用作对象的重复算子,但在作为重复算子使用时一定要注意
注意: * 每个重复的对象都有相同的id,即指向内存中的同一个地址,所以在对每个对象进行操作时一定要注意。
举例来说:
>>> alist = [range(3)]*4
>>> alist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
上面初始化了一个二级列表来模拟矩阵。矩阵为4X3。为了描述方便,这里矩阵记为A。
现在我想给A11赋值为1,用下面的代码:
alist[0][0]=1
那我们想要的结果应该是:
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
可是很不幸,我们得到的是:
[[1, 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]
这是怎么回事,为什么要给A21赋值,为什么其他Ai1也会相应变化呢?
原因是这样的:
我们在文章开头已经说过,*重复的对象id相同,也就是指向内存中的同一个地址,所以一定要注意每个对象的操作。
当我们重新初始化时,我们使用重复运算符“*”。当这个运算符对对象进行重复操作时,它会将所有重复的对象指向同一个内存地址,所以当你改变其中一个值时,
其他值自然会被更新,python中的解释是如下命令和输出:
>>> id(alist[0])
18858192
>>> id(alist[1])
18858192
>>> id(alist[2])
18858192
>>> id(alist[3])
18858192
>>>
看到了吧,id都是一样滴,也就是说这4个list是同一个“list”。
这样的话,我们要模拟一个矩阵怎么办呢?除了有一个特殊的numpy包,你当然可以将新的列表一个一个地追加到上面的列表中,例如:
>>> blist=[]
>>> for i in range(4):
blist.append([j for j in range(3)])
>>> blist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
这样,我们再试试上面的赋值操作:
>>> blist[0][0]=1
>>> blist
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>>
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python web 最流行的三个框架10/16
- ♥ 如何在python中手动输入文本09/29
- ♥ python源文件的字符编码09/18
- ♥ 如何将元素插入到python中的列表中10/16
- ♥ 如何编写python脚本的第一行11/18
- ♥ python的函数体是什么09/28
内容反馈