Python中等价于php的foreach($array as $key => &$value)

36 投票
4 回答
47536 浏览
提问于 2025-04-16 16:47

有没有类似于这个PHP写法的东西,它会改变原来的数组(注意引用操作符)?

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

我只知道这种方法,但它看起来不太优雅:

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

4 个回答

2

关于引用的内容。

在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]
67

当我们在一个列表上使用内置的 enumerate() 函数时,它会返回一个可以逐个访问的对象。这个对象会给我们返回两个东西:一个是计数(也就是索引),另一个是列表中的值。

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

你可以使用列表推导式

newArray = [i + 1 for i in array]

撰写回答