2011-05-01 68 views
26

是否有任何與此PHP符號等價的方法,它會更改原始數組(注意參考運算符)?

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

我知道只有這樣,這是不那麼優雅:

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

回答

5

你可以使用list comprehension

newArray = [i + 1 for i in array] 
+2

這是好的,如果你的列表是很小的,但如果你處理大量數據的,要避免分配第二個列表 – blubb 2011-05-01 22:10:02

+0

對於更大的列表,這是真的,我們將不得不妥協幻想代碼的效率:) – Sahas 2011-05-01 22:18:58

+0

但我仍然認爲列表理解會比使用枚舉更快。但我想這取決於列表理解如何在內部工作。 – Sahas 2011-05-01 22:23:34

46

當內置enumerate()函數被調用列表上,它返回一個可以迭代的對象,返回一個計數和從列表返回的值。

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

另外,PHP的數組類型可以作爲數組,列表或字典來使用,具體取決於你放入的內容;所以'對於字典中的鍵值,可以應用dictionary.iteritems():'。 – 2011-05-02 06:06:52

1

,我不知道是能夠得到一個指向列表項,而是通過索引來訪問一個更清潔的方式證明由http://effbot.org/zone/python-list.htm

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

關於引用。

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