我将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语句结束。
答案 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 values的Ned Batchelder。
顺便说一句,您的整个函数可以更具惯用性地编写为:
is True
如果g()
仅返回True
或False
,则可以取消{{1}}。