簡體   English   中英

函數中的Python修改列表

[英]Python modifying list within function

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

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]

Edit1:我也嘗試使用以下功能。 它也不起作用。 可能是因為在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]

您必須返回並將返回的值分配給list1

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

list1=func(list1)

或者您必須引用list1作為func() global func()

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)
....

您遇到了“按名稱傳遞”的問題。 您顯示的代碼僅更改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:不這樣做。 副作用是邪惡的:)

選項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]

請轉到http://www.pythontutor.com/visualize.html可視化您的代碼。 它會為您提供更准確的解釋。

這是一個簡短的解釋,以及兩個可能的解決方案供您提問:

list1 = list1[2:]

該行創建一個新列表,並將其分配給func名稱空間中的局部變量list1 ,同時保持全局列表不變 在此處輸入圖片說明

如果要更改原始列表:

  1. 請使用就地更改方法 (刪除,彈出等)獲取可在此處找到的列表。

  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] 

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM