带有不可变对象作为lista=[1,2]b=a*3#则b为[1,2,1,2,1,2]带有可变对象元素列表#如果列表使用列表作为元素a=[[1]]b=a*3#那么b就是[[1],[1],[1]]#但是有趣的是id(b[0])==id(b[1])==id(b[2])#也就是说b的三个列表元素都是对一个原始列表元素项的引用,#其实有nonewlist这和直接定义b=[[1],[1],[1]]#是完全不同的。直接定义的b的每个列表元素项的id值是不同的。上面的文字解释可能还是不太清楚,这里我们用图片来帮助解释:a*3得到的b在内存中的示意图如图所示,下标项0、1、2指向列表元素item[1],item的下标0对应内存中的值1。图中直接定义了b=[[1],[1],[1]]。可以看出,下标项0、1、2分别指向三个不同的列表元素项[1],而这三个不同的列表元素项的下标0自然对应内存中的值1。包含可变对象和不可变对象作为元素a=[[1],2]b=a*3#那么b就是[[1],2,[1],2,[1],2]#还有id(b[0])==id(b[2])==id(b[4])总结一下python中的这个现象,个人认为是语言实现的bug,算不上真正有趣的知识点有哪些.这是很自然的逻辑。对于a*3得到的b,当我们希望分别修改b[0]和b[1]时,会发现会同时修改(a=[[1]]),这也太easy会导致错误,不符合一般逻辑。
