为什么可以';我是否使用for循环(python)更改或重新分配列表中变量的值?

为什么可以';我是否使用for循环(python)更改或重新分配列表中变量的值?,python,Python,如果我有一个数字列表,并且我想使用for循环增加它们,为什么这不起作用: >>> list=[1,2,3,4,5] >>> for num in list: ... num=num+1 ... >>> list [1, 2, 3, 4, 5] 我希望得到[2,3,4,5,6] 我知道我可以通过这样做来解决这个问题 >>> newlist=[] >>> for num in list: ...

如果我有一个数字列表,并且我想使用for循环增加它们,为什么这不起作用:

>>> list=[1,2,3,4,5]
>>> for num in list: 
...  num=num+1
... 
>>> list
[1, 2, 3, 4, 5]
我希望得到[2,3,4,5,6]

我知道我可以通过这样做来解决这个问题

>>> newlist=[] 
>>> for num in list: 
...  newlist.append(num+1)
... 
>>> newlist
[2, 3, 4, 5, 6]
>>> 

但一定有更简单的方法

这是因为您只获得对列表中变量的引用。替换它时,只需更改该引用所指向的内容,因此列表中的项保持不变。对此最好的解释是一步一步地浏览该链接中的执行可视化,应该非常清楚

请注意,可变对象可以在适当的位置发生变化,这将影响列表(因为对象本身将发生变化,而不仅仅是您使用的名称所指向的对象)。有关比较,请参见

这里最好的选择是一个


这是因为您只获得对列表中变量的引用。替换它时,只需更改该引用所指向的内容,因此列表中的项保持不变。对此最好的解释是一步一步地浏览该链接中的执行可视化,应该非常清楚

请注意,可变对象可以在适当的位置发生变化,这将影响列表(因为对象本身将发生变化,而不仅仅是您使用的名称所指向的对象)。有关比较,请参见

这里最好的选择是一个


这是python中赋值工作方式的产物。当你做作业时:

name = something
您正在获取对象
something
(这是计算右侧的结果),并将其绑定到本地命名空间中的名称
name
。在执行
for
循环时,获取循环中某个元素的引用,然后通过向旧对象添加1来构造新对象。然后将该新对象分配给当前命名空间中的名称
num
(一次又一次)

如果原始列表中的对象是可变的,则可以在for循环中对对象进行变异:

lst = [[],[],[]]
for sublst in lst:
    sublst.append(0)
您将在原始列表中看到这些更改--请注意,我们在这里没有做任何赋值

当然,正如lattyware所建议的,您可以使用列表理解来构建新列表:

new_list = [x+1 for x in old_list]
您甚至可以将任务安排在适当的位置:

old_list[:] = [x+1 for x in old_list]

这是python中赋值工作方式的产物。当你做作业时:

name = something
您正在获取对象
something
(这是计算右侧的结果),并将其绑定到本地命名空间中的名称
name
。在执行
for
循环时,获取循环中某个元素的引用,然后通过向旧对象添加1来构造新对象。然后将该新对象分配给当前命名空间中的名称
num
(一次又一次)

如果原始列表中的对象是可变的,则可以在for循环中对对象进行变异:

lst = [[],[],[]]
for sublst in lst:
    sublst.append(0)
您将在原始列表中看到这些更改--请注意,我们在这里没有做任何赋值

当然,正如lattyware所建议的,您可以使用列表理解来构建新列表:

new_list = [x+1 for x in old_list]
您甚至可以将任务安排在适当的位置:

old_list[:] = [x+1 for x in old_list]

您可以通过索引数组来实现这一点

>>> list=[1,2,3,4,5]
>>> for i in range(len(list)): 
...  list[i]=list[i]+1

这将避免Lattyware提到的引用问题。

您可以通过索引数组来实现这一点

>>> list=[1,2,3,4,5]
>>> for i in range(len(list)): 
...  list[i]=list[i]+1

这将避免Lattyware提到的引用问题。

这是因为整数是不可变的,这是因为整数是不可变的。这是一种可怕的Python循环方式。我真诚地建议不要这样做。你可以在这里使用
enumerate()
。@Lattyware同意。。。我自己使用理解,但我想说明的是,对列表进行索引可以让您直接更改值。@AshwiniChaudhary——我经常想知道,在枚举(…)中,uu.in enumerate(…):是否比范围内的I(
):
更好。我想,
enumerate
可以处理任意的iterables,但在这种情况下,索引实际上并不有用…@mgilson 1。在迭代时,索引通常很有用-我有很多情况需要索引,但通常不用于查找!2.我确信使用enumerate一定会更有效,因为每次使用x[I]访问容器都是不必要的查找。三,。毫无疑问,这是一种更好的风格,因为无论您是在迭代生成器、列表还是其他Iterablette,您都有相同的语法。这是一种可怕的Python循环方式。我真诚地建议不要这样做。你可以在这里使用
enumerate()
。@Lattyware同意。。。我自己使用理解,但我想说明的是,对列表进行索引可以让您直接更改值。@AshwiniChaudhary——我经常想知道,在枚举(…)中,uu.in enumerate(…):是否比范围内的I(
):
更好。我想,
enumerate
可以处理任意的iterables,但在这种情况下,索引实际上并不有用…@mgilson 1。在迭代时,索引通常很有用-我有很多情况需要索引,但通常不用于查找!2.我确信使用enumerate一定会更有效,因为每次使用x[I]访问容器都是不必要的查找。三,。毫无疑问,这是一种更好的样式,因为无论是迭代生成器、列表还是其他可重用对象,您都有相同的语法