【发布时间】: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
【问题讨论】:
是否有任何等效于这个 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 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]
【讨论】:
当在列表上调用内置的enumerate() 函数时,它会返回一个可以迭代的对象,返回一个计数和从列表返回的值。
for i, val in enumerate(array):
array[i] += 1
【讨论】:
for key,value in dictionary.iteritems(): 可能适用。
你可以使用list comprehension:
newArray = [i + 1 for i in array]
【讨论】:
我不知道能够获得指向列表项的指针,但http://effbot.org/zone/python-list.htm 演示了一种更简洁的按索引访问方式:
for index, object in enumerate(L):
L[index] = object+1
【讨论】: