【问题标题】:understanding for loops with reference to list containers in python参考python中的列表容器理解for循环
【发布时间】:2011-08-20 12:12:32
【问题描述】:

我的问题是关于以下 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 .. 虽然我仍然想知道这里发生了什么以及其他选择是什么时候我有列表列表或更多嵌套列表。

【问题讨论】:

    标签: python list reference for-loop


    【解决方案1】:

    python执行v = [0, 0, 0]的时候是

    1. 创建一个包含三个零的新列表对象。
    2. 将对新列表的引用分配给名为v 的标签

    v 之前是否引用过其他东西并不重要。

    如果要更改v 当前引用的列表的内容,则不能使用v = 语法。您必须像您提到的那样为其分配元素,或者使用 Sven 指出的切片符号 v[:] =

    【讨论】:

    • 这是一个比 Sven 更好的答案,因为它试图解释一些正在发生的事情,而不是仅仅给出一个盲目遵循的食谱。 (至少,这就是我现在在 Sven 中看到的全部内容;也许他会编辑它。)
    • 感谢您到目前为止的解释。因此,我们可以使用v[:] = ... 来改变循环体中v 指向的列表元素,因为这个列表元素本身就是一个列表。现在,如果它只是一个整数或除列表之外的任何其他东西——有没有办法在不改变循环头的情况下改变它?
    • @Jan-PhilipGehrcke:某些类型,例如 int,是不可变的。这意味着该类型的实例永远无法更改其值。常见的不可变类型有数字类型、字符串和元组。
    【解决方案2】:
    x = [[1,2,3],[4,5,6]]
    for v in x:
        v[:] = [0,0,0]
    

    应该可以解决问题。

    【讨论】:

    • 很好:) ...我想如果我有 x=[[1,2,3],[4,5,6]]; x=[x,x] .. 然后 -i 可以在我的嵌套列表的末尾使用相同的方法.. 像这样: for v in x: for i in v: i[:] = [0,0,0]
    • @user:小心点。当您说x = [x, x] 时,新列表中的两个元素具有相同的标识,因此您对一个元素所做的任何更改都会影响另一个元素。 (其实只有一个)
    • 对不起,我的意思可能是x=[x[:],x[:]]。我只是在创建整数列表列表时很懒
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多