为什么我不能在python中的for循环中重新赋值变量?

时间:2014-05-14 06:34:50

标签: python for-loop

今天我发现一个有趣的事实,我不能在'for循环'中重新赋值变量,但为什么呢?

这是我的代码:

>>> my_list = [1,2,3,4,5]
>>> for i in my_list:
>>>     if i > 3:
>>>        i = 'my_value'
>>> my_list
[1, 2, 3, 4, 5]

2 个答案:

答案 0 :(得分:3)

当您使用for i in my_list循环遍历列表时,i在每次迭代时都不会绑定到列表单元格。它绑定到列表单元所引用的对象。为i分配新值会将i绑定到新对象,但i与导致列表单元格受影响的列表之间没有链接。

循环列表的等效方法是

for index in range(len(my_list)):
    i = my_list[index]
    whatever_loop_body()

希望在此公式中更明确i不是列表单元格的别名。 (不要实际上循环这样的列表。)

答案 1 :(得分:0)

让我猜一下,你想得到如下结果

[1, 2, 3, 'my_value', 'my_value']

为此,您需要这样做:

['my value' if i > 3 else i for i in x]

更新

为什么你的代码不起作用?因为i不是对象的引用,而是原始值赋值。 Python variable reference assignment

更新2

如果列表的元素是对象而不是基元,则i似乎成为对该对象的引用。

class A:
    def __init__(self, val):
        self.value = val

my_list = [A(1), A(2),A(3),A(4),A(5)]
for i in my_list:
   if i.value > 3:
       i.value = 'my_value'

print([i.value for i in my_list])
# [1, 2, 3, 'my_value', 'my_value']

更新3

请参阅下面评论中的一些讨论。在python中,一切都是对象。没有原始。

参考:For Syntax