我试图理解以下函数的作用,具体是if
部分正在做什么:
def remove(items, value):
new_items = []
found = False
for item in items:
if not found and item == value:
found = True
continue
new_items.append(item)
if not found :
raise ValueError('list.remove(x): x not in list')
return new_items
声明if not found and item == value:
和变量found
的技巧。有人可以具体解释一下吗?
谢谢,现在我理解上面的示例代码段。我可以编写代码来实现我的想法
我的想法是首先确保该值在初始列表中。然后将每个项目与该值进行比较,将不满足条件项目!=值的项目添加到新列表new_items,最后返回新列表。
def remove(items, value):
new_items = []
for item in items:
if item == value :
continue
else :
new_items.append(item)
if len(items) == len(new_items):
print("This value is not in the list")
return new_items
答案 0 :(得分:1)
found
只是一面旗帜;虽然它是False
(not found
是True
),但您正在针对目标item
检查每个value
。当您找到匹配项时,将found
设置为True
,并绕过匹配的项目(continue
跳过循环体的其余部分,立即返回循环顶部,所以append
没有被调用。)
之后,not found
始终为False
,并且由于and
是短路测试,如果左侧是False
,则右侧甚至没有检查过。从那以后,您只需追加所有剩余物品即可。通过使用标志并首先检查它,您:
value
list
副本
not somebool
是Python中可用的最便宜的测试,除了测试编译时常量),加快代码加速答案 1 :(得分:1)
由于found
被初始化为False
,这意味着not found
被评估为True
,所以当我们迭代这些项目时,直到我们找到了我们正在寻找的项目,我们将比较每个item == value
,如果它评估为True
,我们将进入if
正文并执行两项操作:
found
的值修改为True
:这意味着从现在开始
我们永远不会再次输入if
块continue
我们将“跳过”添加此项目的部分
结果总结一下:当我们在迭代期间遇到value
的第一次出现时,我们将翻转标志found
的值,我们将跳过添加它的部分到新名单。这将导致将所有项目但添加到新列表中。