【问题标题】:How to re-assign items in a list in Python?如何在 Python 中重新分配列表中的项目?
【发布时间】:2013-04-16 07:11:59
【问题描述】:

我想在 Python 中重新分配列表中的每个项目。

In [20]: l = [1,2,3,4,5]
In [21]: for i in l:
   ....:     i = i + 1
   ....:     
   ....:     

但列表根本没有改变。

In [22]: l
Out[22]: [1, 2, 3, 4, 5]

我想知道为什么会这样。任何机构都可以详细解释列表迭代吗?谢谢。

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

    您不能那样做,您只是更改绑定到名称i 的值。在for 循环的每次迭代中,i 被绑定到列表中的一个值。从某种意义上说,它不是指针,通过更改 i 的值,您正在更改列表中的值。相反,正如我之前所说,它只是一个名称,您只是更改名称所指的值。在本例中,i = i + 1i 绑定到值i + 1。所以你实际上并没有影响列表本身,你必须通过索引来设置它。

    >>> L = [1,2,3,4,5]
    >>> for i in range(len(L)):
            L[i] = L[i] + 1
    
    >>> L
    [2, 3, 4, 5, 6]
    

    一些pythonistas可能更喜欢这样迭代:

    for i, n in enumerate(L): # where i is the index, n is each number
        L[i] = n + 1
    

    但是,您可以通过列表推导轻松获得相同的结果:

    >>> L = [1,2,3,4,5]
    >>> L = [n + 1 for n in L]
    >>> L
    [2, 3, 4, 5, 6]
    

    欲了解更多信息:http://www.effbot.org/zone/python-objects.htm

    【讨论】:

    • 为什么id(l[0])for i in l: print id(i) 打印出相同的ID?
    • @Blender 因为它们都引用同一个对象。我的解释有问题吗?
    • 使用enumerate(L) 而不是range(len(L))。列表理解只有在您将其重新分配给相同名称时才符合预期:L = [i+1 for i in L] 否则表达式不会更改原始 L
    • @BurhanKhalid 好主意,除了我把range留在那里,这不是禁忌或任何东西
    【解决方案2】:

    这是因为 Python 处理变量及其引用的值的方式。

    你应该修改列表元素本身:

    for i in xrange(len(l)):
      l[i] += 1
    

    【讨论】:

      【解决方案3】:
      >>> a = [1, 2, 3, 4, 5]
      >>> a = [i + 1 for i in a]
      >>> a
      [2, 3, 4, 5, 6]
      

      【讨论】:

        【解决方案4】:

        最初 i 是一个指向列表内项目的指针,但是当你重新分配它时,它会指向新的数字,这就是列表不会改变的原因。

        对于可变对象的列表,它会起作用:

        class Number(object):
            def __init__(self,n):
                self.n=n
            def increment(self):
                self.n+=1
            def __repr__(self):
                return 'Number(%d)' % self.n
        
        a = [Number(i) for i in xrange(5)]
        
        print a
        for i in a:
            i.increment()
        print a
        

        但是 int 不是可变的,当你对它们进行操作时,你会得到一个新的 int 对象,这就是为什么它在你的情况下不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          相关资源
          最近更新 更多