嵌套列表[[0, 0], [0, 0], [0, 0]]赋值的有关问题解决不了啊求指导
嵌套列表[[0, 0], [0, 0], [0, 0]]赋值的问题解决不了啊,求指导!
用b=[[0,0]]*3建立了这样一个嵌套列表
[[0, 0], [0, 0], [0, 0]]
想把这个嵌套列表变成
[[1, 0], [0, 0], [0, 0]],就是在第一个子列表的第一个元素那加1,其它的元素都不变
用b[0][0]=1,结果却变成了这样
[[1, 0], [1, 0], [1, 0]],即每各个子列表中的第一个元素全都自动加上了1
请问这是怎么回事?该怎么解决?
------解决方案--------------------
------解决方案--------------------
使用*3重复生成的三个元素指向内存中的同一个list子对象[0,0],你可以用id()函数查看每个元素的id:
你可以浅拷贝第一个[0, 0],然后再赋值:
------解决方案--------------------
注意深浅复制,可变对象以及不可变对象。你想在使用过程中改变值,那就生成的时候打破b[0]---b[n]之间的关系,否则中途变其中一个是不可能的。
用b=[[0,0]]*3建立了这样一个嵌套列表
[[0, 0], [0, 0], [0, 0]]
想把这个嵌套列表变成
[[1, 0], [0, 0], [0, 0]],就是在第一个子列表的第一个元素那加1,其它的元素都不变
用b[0][0]=1,结果却变成了这样
[[1, 0], [1, 0], [1, 0]],即每各个子列表中的第一个元素全都自动加上了1
请问这是怎么回事?该怎么解决?
------解决方案--------------------
In [3]: b = [[0,0]]*3
In [4]: b[0] is b[1]
Out[4]: True
In [5]: c = [[0,0] for _ in range(3)]
In [6]: c[0] is c[1]
Out[6]: False
In [7]: c[0][1] = 1
In [8]: c
Out[8]: [[0, 1], [0, 0], [0, 0]]
------解决方案--------------------
使用*3重复生成的三个元素指向内存中的同一个list子对象[0,0],你可以用id()函数查看每个元素的id:
>>> b = [[0,0]]*3
>>> for x in b:
... print id(x)
...
40032136
40032136
40032136
你可以浅拷贝第一个[0, 0],然后再赋值:
>>> b[0] = b[0][:]
>>> b[0][0] = 1
>>> b
[[1, 0], [0, 0], [0, 0]]
------解决方案--------------------
注意深浅复制,可变对象以及不可变对象。你想在使用过程中改变值,那就生成的时候打破b[0]---b[n]之间的关系,否则中途变其中一个是不可能的。