更改范围之外的列表

时间:2018-12-25 18:39:35

标签: python list scope

我正在尝试从列表中删除某项,就像这样:

TodoList=[{'ID':5,'TodoItem':'walk','isDone':False}];

def RemoveItem(ID):
     if not any(todoItem['ID'] == ID for todoItem in TodoList):
          return 'item does not exist';

     RemovedList=list(filter(lambda todoItem:todoItem['ID']!= ID,TodoList))
     TodoList=RemovedList

不起作用,我也尝试过:

 def RemoveItem(ID):
         nonlocal TodoList
         if not any(todoItem['ID'] == ID for todoItem in TodoList):
              return 'item does not exist';

         TodoList=list(filter(lambda todoItem:todoItem['ID']!= ID,TodoList))

有人知道出什么问题吗?

2 个答案:

答案 0 :(得分:2)

一个可能的解决方法。

将待办事项列表(字典列表)作为参数传递,因此会发生变化:

TodoList=[{'ID':5,'TodoItem':'walk','isDone':False}, {'ID':6,'TodoItem':'talk','isDone':True}]

def RemoveItem(ID, TodoList):
     if not any(todoItem['ID'] == ID for todoItem in TodoList):
          print('item does not exist');
     else:
      for item in TodoList:
        if item['ID']== ID: TodoList.remove(item)


RemoveItem(5, TodoList)

print(TodoList)
#=> [{'ID': 6, 'TodoItem': 'talk', 'isDone': True}]


为了使解决方案正常工作,您需要返回:

def RemoveItem(ID, TodoList):
     if not any(todoItem['ID'] == ID for todoItem in TodoList):
          return 'item does not exist';
     else:
      return list(filter(lambda todoItem:todoItem['ID']!= ID, TodoList))


print(RemoveItem(5, TodoList))
#=> [{'ID': 6, 'TodoItem': 'talk', 'isDone': True}]

这是因为list(filter(lambda todoItem:todoItem['ID']!= ID, TodoList))行不会使列表发生突变,而是根据条件提取元素。

但是,如果没有要删除的项目,最好返回列表本身,而不是返回字符串。

答案 1 :(得分:1)

可能的解决方案是找到ID为ID的项目的索引,然后使用pop

todo_list = [{'ID': 5, 'TodoItem': 'walk', 'isDone': False}]


def remove_item(ID):
    if not any(todoItem['ID'] == ID for todoItem in todo_list):
        return 'item does not exist'

    # get index of id
    idx = next(i for i, e in enumerate(todo_list) if e['ID'] == ID)

    # remove and return
    return todo_list.pop(idx)


print(remove_item(4))
print(remove_item(5))
print(todo_list)

输出

item does not exist
{'isDone': False, 'ID': 5, 'TodoItem': 'walk'}
[]

第一次尝试的问题是,当您执行以下操作时:TodoList=RemovedList在函数内部,即使存在具有相同名称的全局变量,它也会在函数内部创建新的局部变量。在第二次尝试中,您需要设置为全局而不是非本地:

todo_list = [{'ID': 5, 'TodoItem': 'walk', 'isDone': False}]

def RemoveItem(ID):
    global todo_list
    if not any(todoItem['ID'] == ID for todoItem in todo_list):
        return 'item does not exist';

    todo_list = list(filter(lambda todoItem: todoItem['ID'] != ID, todo_list))


RemoveItem(5)
print(todo_list)

输出

[]

进一步

  1. global上的文档