打印不起作用

时间:2016-10-03 18:12:30

标签: python

我将list和两个函数传递给一个函数。在这个函数中,我将为该原始列表分配一个新列表。该函数基于新列表的属性毫无困难地返回一个值。问题是,当我尝试从函数外部打印现在修改的列表时(例如在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语句结束。

2 个答案:

答案 0 :(得分: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

如果有效,请告诉我

答案 1 :(得分:0)

这不会修改您传入函数的列表:

L

它只是使本地名称newL引用L引用的同一对象。调用范围中的L[:] = newL 仍然引用原始列表。

取而代之的是

L

这会分配一个切片,该切片会改变本地名称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) 引用的对象。

有关此内容的详细讨论,请参阅Facts and myths about Python names and valuesNed Batchelder

顺便说一句,您的整个函数可以更具惯用性地编写为:

is True

如果g()仅返回TrueFalse,则可以取消{{1}}。