我将列表和两个函数传递到一个函数中。在这个函数中,我给原来的列表赋值了一个新列表。该函数根据新列表的属性毫无困难地返回一个值。问题是,当我试图从函数外部(例如在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()
只返回True
或False
,则可以省略is True
。