警惕python中的*重复符(运算符)
发布时间:2025-09-22 10:56:56
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都是一样的,也就是说这四个list是一样的。list”。
在这种情况下,如果我们想模拟一个矩阵,我们该怎么办?除了特殊的numpy包,你当然可以给上层listappend新的list,比如:
>>>blist=[] >>>foriinrange(4): blist.append([jforjinrange(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] >>>