Skip to main content
 首页 » 编程设计

python之就地修改 Python 列表

2025年05月04日12fff_TT

我正在尝试在主列表级别对列表列表执行就地修改。但是,当我尝试修改迭代变量(下例中的 row)时,它似乎创建了一个指向它的新指针而不是修改它。


我的问题的最小例子。

c = [1,2,3] 
for x in c: 
    x = x + 3 
print(c) #returns [1,2,3], expected [4,5,6] 

上面的例子是我的问题的一个简单例子。有没有一种方法可以按元素就地修改 x 并将更改显示在 C 中?


我的问题的不那么简单的例子。我将全 0 切换为 1,反之亦然。

A =  [[1,1,0], 
      [1,0,1], 
      [0,0,0]] 
for row in A: 
    row = list(map(lambda val: 1 - val, row)) 
print(A) 

预期

A = [[0,0,1], 
     [0,1,0], 
     [1,1,1]] 

返回

A = [[1,1,0], 
     [1,0,1], 
     [0,0,0]] 

更新: 到目前为止很好的答案。我对迭代变量(第二个示例中的 row)如何链接到可迭代变量(第二个示例中的 A)很感兴趣。

如果我执行以下操作,反转 A 的每个子列表,它会完美地工作。

为什么下面的示例(我修改了迭代变量)有效而上面的示例却没有?

A =  [[1,1,0], 
  [1,0,1], 
  [0,0,0]] 
 
for row in A: 
    row.reverse() 
print(A) 
 
#returns, as expected 
A = [[0, 1, 1], 
     [1, 0, 1],  
     [0, 0, 0]] 

请您参考如下方法:

我在文档中找到了这个:https://docs.python.org/3/tutorial/controlflow.html#for

Python’s for statement iterates over the items of any sequence (a list or a string), in the order that they appear in the sequence.

If you need to modify the sequence you are iterating over while inside the loop (for example to duplicate selected items), it is recommended that you first make a copy. Iterating over a sequence does not implicitly make a copy.

我的第一个 react 是错误的,当遍历列表时,它会返回该列表中的实际项目。但是,似乎无法在迭代时直接编辑它们。这就是为什么迭代列表长度的整数有效。

至于为什么 .reverse() 函数起作用,我认为是因为它影响的是列表而不是值。我尝试在非列表数据类型上使用类似的内置函数,例如在字符串上使用 .replace(),但没有效果。

我试过的所有其他列表函数都有效:.append()、.remove() 和 .reverse() 作为你展示了。我不确定这是为什么,但我希望它能更清楚地说明您可以在 for 循环中做什么。

下面旧问题的答案:

您使用 for 循环的方式不会影响实际的列表,只会影响遍历列表的临时变量。有几种方法可以解决这个问题。您可以计算到列表的长度并直接修改列表,而不是遍历每个元素。

c = [1,2,3] 
for n in range(len(c)): 
    c[n] += 3 
print(c)  

您还可以使用 enumerate() 函数循环访问计数器和列表项。

c = [1,2,3] 
for n, x in enumerate(c): 
    c[n] = x + 3 
print(c)  

在这种情况下,n 是一个计数器,x 是列表中的项目。

最后,您可以使用列表理解生成一个新列表,其中一行包含所需的差异。

c = [1, 2, 3] 
d = [x + 3 for x in c] 
print(d)