如何在for循环中改变x的值?
在使用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的值可以被改变,但一旦循环自己又改变了它,它的变化就会消失呢?有没有办法解决这个问题?谢谢!
3 个回答
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
,将其设置为一个空列表,然后将新列表的内容添加到这个空列表中)。
列表推导式:
myNewList = [x**2 for x in myList]
或者使用 for 循环:
myNewList = []
for x in myList:
myNewList.append(x**2)
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
x
在每次循环的时候都是一个不同的变量。它是不可变的,所以你对它所做的任何修改在原来的列表中是看不见的。如果你想改变列表中某个元素的值,你需要这样做:
>>> myList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i,_ in enumerate(myList):
... myList[i] += 1
... print myList[i]