【问题标题】:Python equivalent of php's foreach($array as $key => &$value)Python 相当于 php 的 foreach($array as $key => &$value)
【发布时间】:2011-08-16 15:25:48
【问题描述】:

是否有任何等效于这个 PHP 表示法,它改变了原始数组(注意引用运算符)?

// increase value of all items by 1
foreach ($array as $k => &$v) {
    $v++;
}

我只知道这样,不太优雅:

for i in range(len(array)):
    array[i] += 1 

【问题讨论】:

    标签: python for-loop


    【解决方案1】:

    关于参考资料。

    在python中,每个值都是对象,每个“变量”都是对对象的引用。赋值永远不会复制值,它总是分配引用。

    所以默认情况下,for k,v in enumerate([1,2,3]) 中的 v 也是引用。然而,大多数基本“类型”的对象都是不可变的,因此当您执行 immutable_object_reference += 1 时,您会创建 int 的新实例并将 immutable_object_reference 更改为指向新实例。

    当我们的值是可变类型时,引用的工作方式与 PHP 相同:

    >>> class mutable_pseudoint(object):
    ...     def __init__(self, d):
    ...         self.d = d
    ...     def __iadd__(self, v):
    ...         self.d += v
    ...     def __repr__(self):
    ...         return self.d.__repr__()
    ...     def __str__(self):
    ...         return self.d.__str__()
    ... 
    >>> l = [mutable_pseudoint(1), mutable_pseudoint(2), mutable_pseudoint(3), mutable_pseudoint(4)]
    >>> l
    [1, 2, 3, 4]
    >>> for k,v in enumerate(l):
    ...     v += 1
    ... 
    >>> l
    [2, 3, 4, 5]
    

    【讨论】:

      【解决方案2】:

      当在列表上调用内置的enumerate() 函数时,它会返回一个可以迭代的对象,返回一个计数和从列表返回的值。

      for i, val in enumerate(array):
          array[i] += 1
      

      【讨论】:

      • 另外,PHP 的数组类型可以用作数组、列表或字典,具体取决于您放入的内容;所以for key,value in dictionary.iteritems(): 可能适用。
      【解决方案3】:

      你可以使用list comprehension:

      newArray = [i + 1 for i in array]
      

      【讨论】:

      • 如果您的列表很小,这很好,但如果您处理大量数据,您希望避免分配第二个列表
      • 没错,对于更大的列表,我们将不得不牺牲花哨的代码来提高效率:)
      • 但我仍然认为列表理解会比使用枚举更快。但我想这取决于列表理解在内部是如何工作的。
      • ranaman MS:我没有做基准测试,但 enumerate 使用迭代器,因此内存占用应该低于列表理解。如果记忆不是问题,理解很可能会更快。
      【解决方案4】:

      我不知道能够获得指向列表项的指针,但http://effbot.org/zone/python-list.htm 演示了一种更简洁的按索引访问方式:

      for index, object in enumerate(L):
          L[index] = object+1
      

      【讨论】:

        猜你喜欢
        • 2010-11-16
        • 2011-03-19
        • 2013-08-31
        • 2013-12-31
        • 2022-01-05
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多