为什么不能循环一个数字列表并直接增加每个数字?

巴切维奇

为什么以下代码会增加每个数字:

numbers = [1, 2, 3]

for number in numbers:
    numbers[numbers.index(number)] += 100

print(numbers) # prints [101, 201, 301]

但这不会?:

numbers = [1, 2, 3]

for number in numbers:
    number += 100

print(numbers) # prints [1, 2, 3]

更令人困惑的是,我们似乎在两种情况下都在处理相同的对象:

numbers = [1, 2, 3]

for number in numbers:
    print(numbers[numbers.index(number)] is number) # prints True

我知道这与分配与改变值和/或内存分配有“某种关系”,但我无法确定到底发生了什么。

沃瓦诺

numbers[x]只是numbers.__getitem__(x)(用作右值时)或numbers.__setitem__(x, y)(用作左值时)的不同语法

所以在你的第一个例子中,__setitem__()调用了数字列表方法来更新列表。在引擎盖下,您的代码大致转换为如下所示:

for number in numbers:
    index = numbers.index(number)
    new_value = numbers.__getitem__(index) + 100
    numbers.__setitem__(index, new_value)

请注意,上面的代码是有效的 Python,并且与原始循环具有相同的效果。

在您的第二个示例中,从列表中检索值并将其存储在局部变量中number,然后您将覆盖该变量这对原始列表没有影响。


注意:另请注意,使用比较整数is可能会导致意外行为。有关更多详细信息,请参见例如这篇 SO 帖子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java中的for循环会给我一个数字,而不是0到4的数字列表?

将列表的每个元素乘以一个数字

在C语言中,为什么不使用malloc就不能声明一个指针并将其直接指向一个数字?

在一个循环中将三个元素增加一个数字

为什么一个数字记录为 NaN?

为什么打印$(给出一个数字序列

为什么在while循环中记录一个数字?

为什么没有删除该列表中的最后一个数字?

如何循环一个数字,以便该数字迭代每个可能的值?

列表理解以查找列表中每个数字的所有倍数小于一个数字

Python将列表中的每个数字视为一个单独的数字

为数组的每个项目增加和减少一个数字

在Python中,为什么我的for循环仅当该数字是数组中的最后一个数字时才排除该数字之前的数字?

在Sublime Text 2中为每个选择添加一个数字,每个选择增加一个

输出是数字列表,而不是一个数字

如何在vim中增加一个数字

增加一个数字而不会消除前导零

单击按钮时增加一个数字

在 div 中增加一个数字

如何创建一个数字增加3的数组?

为什么在Matlab中一个数字大于相同的数字?

Haskell-一个无限列表,可被给定列表的每个数字整除

为什么一个数字,例如 2% 一个大于零的空集是真的?

为什么我只能插入一个数字而不是一个名字?

为列表中的每个唯一值分配一个数字

一个数字的数字总和

最后一个数字结束后打印每个数字的空格数

从文档中的每个数字中减去一个数字

每个数字与下一个数字相差 1