Python:通过for循环更改列表

时间:2018-06-22 10:58:43

标签: python

我再次要问你另一个基本问题。 :) 我想通过for循环更改列表。(很抱歉,但是我是新来的...。)

这是第一个脚本:

L=[1,2,3]
i=0
for a in L:
    L[i]+=1
    i+=1
print(L)
print(a)

我知道了

L:[2,3,4]
a: 3

这正是我想要的。 但是我注意到,如果我将脚本更改为此:

L=[1,2,3]
for i in L:
    i+=1
print(L)
print(i)

我得到了:

L:[1,2,3]
i:4

我知道我必须是4。但是问题是为什么列表L不会改变。我认为,列表中的对象被赋予变量i。因此变量i是可以编辑对象的对象。因此,基本上,列表应该更改。但是实际上,它保持不变。

有人可以解释吗?

谢谢!

5 个答案:

答案 0 :(得分:5)

这与Python“变量”的真正含义有关:指向对象的名称。可以将其视为字典,名称作为键,对象作为值。

在您的for循环中,i首先指向列表中的当前迭代项,即i指向L[0],然后指向L[1],依此类推但是,当您执行i += 1(实际上转换为i = i+1)时,您重新绑定了i,使其指向另一个对象。这只会影响名称 i(键所具有的值),而不影响它以前指向的对象,因此您的列表确实没有更改。

要获得更深入的说明,请阅读Ned Batchelder's excellent article。这样可以节省大量时间和挫败感;)

注意:对于您的示例代码段,正确更新列表的正确方法是使用enumerate

for index, value in enumerate(L):
    L[index] = value + 1

或使用列表理解就地更新整个列表:

L[:] = [value+1 for value in L]

答案 1 :(得分:1)

  

但是问题是为什么列表L不会改变

由于您为i分配了任何内容,因此不会影响L[i]

解决方案是您拥有的proposed或通过索引looping

for index, item in enumerate(L):

另一种方法是使用列表理解

L[:] = [i + 1 for i in L]

答案 2 :(得分:1)

感谢您的所有回答!但是这个链接确实很全面。 https://nedbatchelder.com/text/names.html 这与:

m=[1,2,3]
i=m[0]  #here i refers to m[0], namely 1
i=4     #here i refers to a new value

结果显然是:

m=[1,2,3]
i=4

由于int-name最初不能更改。一旦i的值更改,它将引用另一个值(对象)。因此列表不会更改。

谢谢你。

答案 3 :(得分:-1)

循环时

for i in L :
    i+=1

您从不要求Python更改列表L。实际上,您只是更新i。 首先,i = L [0] = 1,您将i更新为2。但是L不变,因为您没有要求更新L [0]。由于L包含数字,所以当您执行for i in L时,我不是L本身的元素,而是L的元素。

正确的方法是:

for i in range(len(L)) :
    L[i] += 1 #you update L[i] itself this time

或者,如果您喜欢更紧凑的方式:

L = [i+1 for i in L]

我希望我足够清楚。 祝你有美好的一天;-)

答案 4 :(得分:-1)

for i in L:

这意味着在遍历列表时,列表中每个元素的值都存储在i中。

因此,如果您更改i的值,列表中将不会发生更改

考虑这个-

a=2
b=a
b=3

更改b不会更改a的值。