2014-12-03 76 views
0

我想通過傳遞列表的引用來讓函數修改列表。下面的程序顯示了當我將一個列表傳遞給該函數時,僅生成了一個局部變量。有什麼方法可以在函數中從列表中選擇一些成員?謝謝。函數內的Python修改列表

def func(list1): 
    list1 = list1[2:]  
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [0, 1, 2, 3] 

編輯1:我也試過使用下面的函數。它也不起作用。也許這是因爲在func2中,list1變成了引用list2的局部變量。

def func2(list1): 
    list2 = list1[2:]  
    list1 = list2 
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [0, 1, 2, 3] 
+0

「選擇一些成員」是什麼意思? – 2014-12-03 05:46:38

+0

我的意思是,從列表中只選擇[2,3] 1 – 2014-12-03 05:48:03

+0

你已經說過了。但是你沒有解釋這意味着什麼。 – 2014-12-03 05:51:35

回答

2

你必須返回值返回並分配給list1

def func(list1): 
    list1 = list1[2:]  
    print(list1) # prints [2, 3] 
    return list1 

list1=func(list1) 

,或者你必須引用list1作爲globalfunc()

1

list1 = list[2:]將創建一個列表,使局部變量的引用新的列表。它不影響原始列表。

使用列表切片分配得到你想要的東西:

def func(list1): 
    list1[:] = list1[2:] 
    print(list1) # prints [2, 3] 

或使函數返回新的列表,並在主叫方指定的返回值:

def func(list1): 
    return list[2:] 

list1 = [0, 1, 2, 3] 
list1 = func(list1) 
.... 
1

您已經遇到「通過名稱」。您顯示的代碼只會改變func()指向的本地「list1」名稱。如果您使用「list1」名稱來更改引用內容的值,而不是將func()中的「list1」名稱指向其他內容,那麼該程序的其餘部分將會看到該名稱。

def func(list1): 
    del list1[0:2] 
    # list1 = list1[2:] 
    # print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1) 
1

選項1:不要這樣做。副作用是邪惡的:)

選項2:如果必須,然後應用你的函數作爲參數接收對象上破壞性的方法:

def func(list1): 
    list1 = list1[2:] 
    list1.pop(0) 
    list1.pop(0) 
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [2, 3] 
1

請轉到http://www.pythontutor.com/visualize.html可視化你的代碼。它會給你一個更準確的解釋。

這裏是一個簡短的說明,併爲你的問題的兩個可能的解決方案:

list1 = list1[2:] 

這行創建了一個新的列表,並將其分配給FUNC命名空間局部變量列表1,而保持全球性依然。 enter image description here

如果你想改變原來的列表:

  1. 請使用替代方法變化(刪除,彈出等),用於可發現here名單。

  2. 或者你可以返回這樣一個新的列表:

    def func(list1): 
        list1 = list1[2:]  
        print(list1) # prints [2, 3] 
        return list1 
    
    list1 = [0, 1, 2, 3] 
    list1 = func(list1) 
    print(list1)  # prints [2, 3] 
    

希望它能幫助。