【问题标题】:Why doesn't this Python 3 for loop change every variable to 4?为什么这个 Python 3 for 循环不将每个变量都更改为 4?
【发布时间】:2015-07-04 08:05:05
【问题描述】:
list = [1,2,3,4,5]
print(list)
for each in list:
    list[each] = 4
print(list)

我得到了结果:

[1, 4, 3, 4, 4]

第 4 行似乎以某种方式将“每个”设置为 4……但我不知道如何。应该将当前迭代器的值更改为 4.,这在 list[4] 处也是如此。

编辑: 等等等等,好吧,'每个'实际上来自列表中的值?这是唯一合乎逻辑的方式,现在我想起来了。

【问题讨论】:

  • fyi,你永远不应该调用 list 的东西 - 这会影响内置的 list() 函数。
  • 阅读 Python 文档,了解迭代列表如何在 Python 中工作。你得到的是项目,而不是索引(因为索引通常是无用的)。实际上,如果您只需要遍历索引,您可以使用for i in range(len(list))。但要真正用一个替换列表中的所有项目,您可以简单地创建一个新项目:list = [4] * len(list)
  • 哦,天哪,我希望阅读这些文档对我来说是有意义的,即使有一半的时间,但在弄清楚你所说的项目而不是索引的意思之后;你到底为什么要让一种语言做到这一点?
  • 实际上 TheifMaster 您可以将其发布为答案吗?这可能是我能得到的最好的了。
  • 如果你把print(each, list)放在循环里面,它可能会变得更清晰......

标签: loops python-3.x for-loop


【解决方案1】:

这样会更好。

list = [1,2,3,4,5]
for each in range(len(list)):
    list[each] = 4
print(list)

您遇到的问题是您的循环遍历了从 1 到 5 的数字,但列表的索引从零开始。

在您的列表中添加一个零元素,或在循环中将每个值减一可以使您的代码正常工作。但是这种方式是有缺陷的,因为你依赖于列表的内容来排列和表示位置。

list = [0,1,2,3,4,5] # zero added here.
for each in list:
    list[each] = 4
print(list)

您的循环实际上正在这样做。

Loop 1: -> [1, 2, 3, 4, 5]
            ^
position 1 = 4.
Output: -> [1, 4, 3, 4, 5]

Loop 2: -> [1, 4, 3, 4, 5]
               ^
position 4 = 4.
Output: -> [1, 4, 3, 4, 4]

Loop 3: -> [1, 4, 3, 4, 4]
                  ^
position 3 = 4. (it is already 4)
Output: -> [1, 4, 3, 4, 4]

Loop 4: -> [1, 4, 3, 4, 4]
                     ^
position 4 = 4. (it is already 4)
Output: -> [1, 4, 3, 4, 4]

Loop 5: -> [1, 4, 3, 4, 4]
                        ^
position 4 = 4. (it is already 4)
Output: -> [1, 4, 3, 4, 4]

【讨论】:

  • ...我买的这个 Python 类根本没有解释“每个”的作用我认为它只是自动执行 (i = 0, i
  • 非常好的分步说明,说明了为什么some_list[5]= 没有发生。
【解决方案2】:

最好使用enumerate(),这样你就可以跳过range(len())

some_list = [1,2,3,4,5]
for i, item in enumerate(some_list):
    some_list[i] = 4
print(some_list)

[4, 4, 4, 4, 4]

这会将some_list 中的每个项目按其索引更改为4

为什么你的方法行不通

您可能认为列表中的第一项具有索引 0,而不是 1 的思维错误 :)
“按你的方式做”将是:

some_list = [1,2,3,4,5]
print(some_list)
for each in some_list:
    some_list[each-1] = 4
print(some_list)

[1, 2, 3, 4, 5]
[4, 4, 4, 4, 4]

编辑

显示@JensB 解释内容的另一种方法是运行下面的代码。它准确地显示了每次迭代中发生的情况:

some_list = [1,2,3,4,5]
print(some_list)
for each in some_list:
    some_list[each] = 4
    print("some_list["+str(each)+"] = 4")
    print(some_list)

[1, 2, 3, 4, 5]
some_list[1] = 4
[1, 4, 3, 4, 5]
some_list[4] = 4
[1, 4, 3, 4, 4]
some_list[3] = 4
[1, 4, 3, 4, 4]
some_list[4] = 4
[1, 4, 3, 4, 4]
some_list[4] = 4
[1, 4, 3, 4, 4]

【讨论】:

    【解决方案3】:

    当迭代一个列表时,你得到的是实际的项目,而不是索引(因为索引通常是无用的)。

    其实,如果你只需要遍历索引,你可以这样做:

    for i in range(len(your_list))
    

    但要实际将列表中的所有项目替换为单个项目,您可以简单地创建一个新项目:

    your_list = [4] * len(your_list)
    

    或者,如果您更喜欢修改现有列表:

    your_list[:] = [4] * len(your_list)
    

    此外,您不应将任何变量命名为list。这隐藏了内置的 list() 函数,该函数非常有用,例如如果你想在列表中转换一个可迭代对象(list 被遮蔽,你必须使用 [x for x in iterable] 而不是 list(iterable))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多