是否有任何与此PHP符号等价的方法,它会更改原始数组(注意参考运算符)?
// increase value of all items by 1
foreach ($array as $k => &$v) {
$v++;
}
我知道只有这样,这是不那么优雅:
for i in range(len(array)):
array[i] += 1
是否有任何与此PHP符号等价的方法,它会更改原始数组(注意参考运算符)?
// increase value of all items by 1
foreach ($array as $k => &$v) {
$v++;
}
我知道只有这样,这是不那么优雅:
for i in range(len(array)):
array[i] += 1
你可以使用list comprehension:
newArray = [i + 1 for i in array]
当内置enumerate()
函数被调用列表上,它返回一个可以迭代的对象,返回一个计数和从列表返回的值。
for i, val in enumerate(array):
array[i] += 1
另外,PHP的数组类型可以作为数组,列表或字典来使用,具体取决于你放入的内容;所以'对于字典中的键值,可以应用dictionary.iteritems():'。 – 2011-05-02 06:06:52
,我不知道是能够得到一个指向列表项,而是通过索引来访问一个更清洁的方式证明由http://effbot.org/zone/python-list.htm:
for index, object in enumerate(L):
L[index] = object+1
关于引用。
在python中,每个值都是object,每个'variable'都是对象的引用。赋值永远不会复制值,它总是指定引用。
因此默认情况下,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]
这是好的,如果你的列表是很小的,但如果你处理大量数据的,要避免分配第二个列表 – blubb 2011-05-01 22:10:02
对于更大的列表,这是真的,我们将不得不妥协幻想代码的效率:) – Sahas 2011-05-01 22:18:58
但我仍然认为列表理解会比使用枚举更快。但我想这取决于列表理解如何在内部工作。 – Sahas 2011-05-01 22:23:34