使用for循环,在迭代列表时,是否可以更改x的值? 例如,
>>> myList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for x in myList:
... print x
如果我改变x的值,那么它将在当前迭代中产生影响,但在下一个迭代中不起作用。使用上面的代码,如果添加了以下代码,
... x += 1
... print x
然后它会打印出来:
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
为什么x的值能够被改变,但是一旦被循环本身改变就失去它的变化。还有,可以解决这个问题吗? 感谢
答案 0 :(得分:2)
x
是每个循环迭代的不同变量。它也是不可变的,因此从原始列表中可以看到您对其所做的任何更改。如果要更改列表中元素的值,则必须执行以下操作:
>>> myList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i,_ in enumerate(myList):
... myList[i] += 1
... print myList[i]
答案 1 :(得分:1)
[x+1 for x in some_list]
这是列表推导的内容......
当你这样做时
for x in some_list:
x += 1 #this only changes the local x
#it does not change the value in the list
如果要替换列表中的值,可以执行
some_list[:] = [x+1 for x in some_list]
^这将修改列表的现有内存
some_list = [x+1 for x in some_list]
将使用新列表覆盖变量some_list
,并且垃圾收集旧的(通常非常直接)
答案 2 :(得分:0)
我不知道我是否理解你的问题,但我会对此表示理解。您没有更改myList
的值。您只是更改了x
的值。 for循环的“变量”(在本例中为x
)只是一种访问迭代中每个 项 的方法(在这种情况下为myList
)。换句话说,x是一个“变量”,代表每个新项目“逐步”myList。因此,x
“弹出和不存在”如果你愿意,而myList在其原始内存位置保持不变。
如果您想更改原始列表,那么您需要按照Joran Beasley的说法进行操作。
引用您的整个列表(请注意,他通过使用[:]
将整个列表编入索引来“抓取”整个列表。
myList[:] = [x+1 for x in myList] #now you've changed the value of myList in the memory location where it was originally created and still "lives"
如果要完全创建不同的列表,则可以创建一个新变量并将其设置为等于列表推导(或使用for loop
,将其设置为等于附加到的空列表你的新名单的内容。)
list comp:
myNewList = [x**2 for x in myList]
或for loop:
myNewList = []
for x in myList:
myNewList.append(x**2)