我再次要问你另一个基本问题。 :) 我想通过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是可以编辑对象的对象。因此,基本上,列表应该更改。但是实际上,它保持不变。
有人可以解释吗?
谢谢!
答案 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的值。