【问题标题】:Why I can't re-assign a variable in a for loop in python? [duplicate]为什么我不能在 python 的 for 循环中重新分配变量? [复制]
【发布时间】:2014-05-14 06:34:50
【问题描述】:

今天我发现了一个有趣的事实,我无法在“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]

【问题讨论】:

  • 您希望i = "foo" 在这里完成什么?终止循环?当 for 循环继续时,它的下一次迭代 (NB: Iterators) i 将指向迭代器 [1, 2, 3, 4] 中下一个元素的新引用对象。

标签: python for-loop


【解决方案1】:

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

循环遍历列表的等效方法是

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

希望在这个公式中更清楚的是i 不是列表单元格的别名。 (实际上不要像这样循环遍历列表。)

【讨论】:

    【解决方案2】:

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

    [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

    【讨论】:

    • -1 他的问题是why?,而不是how?
    • 哦,对不起,我误解了他的问题,。我会重写我的答案
    • i 参考,与你所说的相反。
    • @KonradRudolph,你能帮我验证我的第二次更新是否正确吗?如果没有,任何建议。
    • @Yeo 在第二种情况下,你正在变异。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多