理解Python中列表容器的for循环
我有一个关于下面这个循环的问题:
x=[[1,2,3],[4,5,6]]
for v in x:
v=[0,0,0]
在这里,如果你打印 x,你会得到 [[1,2,3],[4,5,6]]。所以这里的 v 其实并不是指向 x 中列表的引用。但是当你做类似下面这样的操作:
x=[[1,2,3],[4,5,6]]
for v in x:
v[0]=0; v[1]=0; v[2] =0
你会发现 x 变成了 [[0,0,0],[0,0,0]]。如果 x 里面的列表很长,这就有点麻烦了,甚至像这样做:
x=[[1,2,3],[4,5,6]]
for v in x:
for i in v:
i = 0
也会让 x 变成 [[1,2,3],[4,5,6]]。我觉得最好的办法是用 for i in xrange(0,3): v[i]=0。不过我还是想知道这里发生了什么,以及当我有嵌套列表或者更多层嵌套列表时,还有哪些其他的选择。
2 个回答
6
x = [[1,2,3],[4,5,6]]
for v in x:
v[:] = [0,0,0]
这样做就可以了。
7
当 Python 执行 v = [0, 0, 0]
时,它做了以下几件事:
- 创建了一个新的列表对象,这个列表里有三个零。
- 把这个新列表的引用(可以理解为地址)赋给了一个叫
v
的标签。
不管 v
之前指向了什么,这都没关系。
如果你想改变 v
当前指向的列表的内容,那就不能用 v =
这种写法。你必须像你提到的那样给它赋值,或者使用切片的写法 v[:] =
,正如 Sven 所说的。