为什么可以';我是否使用for循环(python)更改或重新分配列表中变量的值?
如果我有一个数字列表,并且我想使用for循环增加它们,为什么这不起作用:为什么可以';我是否使用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: ...
>>> 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]访问容器都是不必要的查找。三,。毫无疑问,这是一种更好的样式,因为无论是迭代生成器、列表还是其他可重用对象,您都有相同的语法