2016-09-17 82 views
0

代碼被傳遞給一個數組。我的理解是這個傳球是通過參考完成的。我希望該函數遞歸地將列表中的最後一半剩餘部分分爲兩部分,並將其分割爲零的每個值進行設置。 對數組的改變發生在數組中,但當我在最後調用print a時,我得到原始數組。如何通過引用傳遞函數來更改列表?

我在做什麼錯了?

a = range(10) 

def listreduction(array): 
    if len(array) == 1: 
     array[0] = 0 
     return 

    split = len(array)/2 
    array[split] = 0 

    return listreduction(array[split:]) 

listreduction(a) 
print a 

的電流輸出爲

[0, 1, 2, 3, 4, 0, 6, 7, 8, 9] 

的應該是更多的零到第二個

+1

您期望得到的輸出是什麼? – BPL

+0

範圍!=數組順便說一句。由於範圍是不可變的,它必須被複製爲函數內某個數組的數組,因此是問題。總是明確地返回;不要依賴副作用。我實際上不記得Python是否通過引用。我似乎記得它比這更復雜。 – Carcigenicate

+0

當您使用遞歸時,您不會將實際列表傳遞給該方法。那就是問題所在。 – scriptmonster

回答

1

這可能是你想要的。

a = range(1, 10) 

def list_reduction(l, prev_split_pos=None): 
    split_pos = (len(l) + prev_split_pos)/2 if prev_split_pos else len(l)/2 
    if split_pos == prev_split_pos: 
     return 
    l[split_pos] = 0 
    return list_reduction(l, split_pos) 

list_reduction(a) 
print a 

所以,你的代碼。每次你做一個列表片時,你實際上會生成一個新列表,而這個列表根本不會與舊列表相關聯。這就是爲什麼除第一個之外沒有看到任何突變。

+0

謝謝!這正是我所期待的。我開始懷疑我的列表傳遞是創建副本,而不是隻在子列表上運行,但仍然存在。 – MattTheSnake

+0

@MattTheSnake不客氣。作爲一個側面說明,看看這個關於在Python中傳遞參考/值的好問題,以便更好地掌握它:http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-通過參考 –

+0

這絕對有助於清除事情。再次感謝您的幫助 – MattTheSnake

1

由於您使用遞歸,在參數切片操作將創建新的列表實例的右側這與你的實例不同。這就是原因。

你可以改變你的代碼如下:

a = range(10) 

def list_reduction(array, position=0): 
    if len(array) -1 <= position: 
     return 

    split = position + (len(array) - position)/2 
    array[split] = 0 
    return list_reduction(array, split) 

list_reduction(a) 
print a 

輸出是:

[0, 1, 2, 3, 4, 0, 6, 0, 0, 0] 
+0

這實際上不起作用。事實上,他實際上並沒有返回這份名單。 – Carcigenicate

+0

我的不好,編輯並糾正了我的錯誤。 – scriptmonster

+0

你輸出的長度是11,怎麼可能? –

2

切片創建一個新的列表。如果您想遞歸執行此操作,您必須傳遞函數應該在列表中工作的索引,而不是實際的切片。

1

Python中的argumnet傳遞不同於其他傳統的編程語言。參數通過對象引用傳遞。而被引用的對象是否會被修改取決於兩件事

  • 該變量是否可變或不可變。在你的情況下,range將創建一個列表,因此它是一個可變對象。這意味着如果你更新array它也應該更新a
  • 操作。 =操作將始終創建新的對象引用。所以即使在你的情況下,array也是可變的,但是由於你正在做賦值操作,它會創建一個新的對象引用。

下面的例子應該爲你清理的東西。

實施例1

>>> a = [1,2] 
    def fun1(array): 
     array= array + [3] 
     print "var array = %s" %array 

    fun1(a) 
    print "var a = %s" %a 

輸出

var array = [1, 2, 3] 
var a = [1, 2] 

實施例2

a = [1,2] 
def fun1(array): 
    array.append(3) 
    print "var array = %s" %array 

fun1(a) 
print "var a = %s" %a 

輸出

var array = [1, 2, 3] 
var a = [1, 2,3]