知行编程网知行编程网  2022-11-23 08:30 知行编程网 隐藏边栏  2 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于警惕python中的*重复符(运算符)的相关知识,包括python除法运算符,以及python字符串以0为结束符这些编程知识,希望对大家有参考作用。

警惕 python 中的 *repeaters(运算符)

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]]
>>>

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享