理解Python中列表容器的for循环

5 投票
2 回答
2551 浏览
提问于 2025-04-16 17:09

我有一个关于下面这个循环的问题:

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] 时,它做了以下几件事:

  1. 创建了一个新的列表对象,这个列表里有三个零。
  2. 把这个新列表的引用(可以理解为地址)赋给了一个叫 v 的标签。

不管 v 之前指向了什么,这都没关系。

如果你想改变 v 当前指向的列表的内容,那就不能用 v = 这种写法。你必须像你提到的那样给它赋值,或者使用切片的写法 v[:] =,正如 Sven 所说的。

撰写回答