2016-10-03 110 views
-3

我正在將列表和兩個函數傳遞給一個函數。在這個函數中,我將這個原始列表分配給一個新的列表。該函數正在毫無困難地基於新列表的屬性返回一個值。問題是,當我試圖從功能外打印現在修改的列表(例如在Spyder的控制檯中)時,將打印原始列表而不是新列表。打印在功能外不起作用

def applyF_filterG(L, f, g): 
    i = 0 
    newL = [] 
    while i < len(L): 
     fint = f(L[i]) 
     if g(fint) == True: 
      newL.append(L[i]) 
     i = i + 1 
    L = newL 
    if len(L) == 0: 
     le = -1 
    else: 
     le = max(L) 
    return le 

對不起,我沒有發佈代碼原來。我運行代碼後,然後打印返回的原始列表。我在pythontutor中運行了代碼,新修改的列表L保留了它的新賦值,直到函數完成return語句爲止。

+1

請提供一些代碼請 –

+1

如果您不返回新列表,您打算如何打印它?將變量重新分配給新列表不會自動返回它 – UnholySheep

+0

歡迎使用堆棧溢出。在繼續之前,請仔細閱讀[幫助頁面](http://stackoverflow.com/help) - 特別是[「我可以詢問什麼主題?」](http://stackoverflow.com/help/on - 「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask),[「我如何提出一個好問題?」](http:// stackoverflow.com/help/how-to-ask)和[「如何創建一個最小,完整和可驗證的示例」](http://stackoverflow.com/help/mcve)。 –

回答

0

這不會修改您傳遞給您的函數的列表:

L = newL 

它只是使本地名稱L指的是newL所指的同一個對象。調用範圍內的L仍指原始列表。

而是做

L[:] = newL 

這就賦予其變異本地名稱L所指的對象切片。

關於此的擴展討論,請參見Facts and myths about Python names and values,作者爲Ned Batchelder

順便說一句,你的整個功能可以更地道寫成:

def applyF_filterG(L, f, g): 
    L[:] = [item for item in L if g(f(item)) is True] 
    return -1 if not L else max(L) 

可以去掉的is True如果g()只返回TrueFalse

+0

謝謝你的工作和網站將是一個有趣的閱讀。 – Susie

2

如果您可以發佈代碼示例,那可能會有幫助。

根據你所說的,似乎新列表只是作爲函數的局部變量存儲。如果你有函數返回舊列表(在被函數修改之後),那可能會解決這個問題。

例子:(我認爲這是你現在所擁有的,Z可以是返回列表屬性)

def function(oldlist, x, y): 
    oldlist = newlist 
    return z 

z=function(oldlist, x, y) 
print oldlist 

這種改變可能會幫助您:

def function(oldlist, x, y): 
    oldlist = newlist 
    return oldlist, z 

oldlist, z=function(oldlist, x, y) 
print oldlist 

讓我知道是否可行

+0

代碼用於考試,分級人員不會容忍代碼中的打印語句。 – Susie

+0

另外,最大的元素(le)是應該返回的唯一東西。 – Susie