今天我发现一个有趣的事实,我不能在'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]
答案 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
如果列表的元素是对象而不是基元,则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']
请参阅下面评论中的一些讨论。在python中,一切都是对象。没有原始。
参考:For Syntax