打印不能在函数外工作



我将列表和两个函数传递到一个函数中。在这个函数中,我给原来的列表赋值了一个新列表。该函数根据新列表的属性毫无困难地返回一个值。问题是,当我试图从函数外部(例如在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语句结束。

如果你能发布一个示例代码,那可能会很有帮助。

根据您所说的,似乎新列表只是作为函数的局部变量存储。如果你让函数返回旧列表(在它被函数修改之后),这可能会解决这个问题。

示例:(我认为这是你现在所拥有的,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

让我知道这是否有效

这不会修改传递给函数的列表:

L = newL 

它仅仅使本地名称L指向newL所指向的同一对象。调用作用域中的L仍然是指原列表

而不是做

L[:] = newL

这将分配给一个片,该片将改变由本地名称L引用的对象。

有关这方面的详细讨论,请参阅Ned Batchelder关于Python名称和值的事实和神话。

顺便说一下,整个函数可以更习惯地写成:
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)

如果g()只返回TrueFalse,则可以省略is True

最新更新