如果 enumerate() 循环后跟一个 break,修改它是否安全?
Is it safe to modify elements inside an enumerate() loop if it is followed by a break?
我写了一些 python 循环遍历如下列表的代码:
for idx, r in enumerate(mylist):
if condition:
del mylist[idx]
break
我的问题是,只要我有 break 语句,在循环内修改此列表(如上例)是否安全?还是我仍然应该在循环外修改列表?
是的,如果其他线程不打算并发使用 mylist,则此代码不是并发的是安全的。但只要我们有 GIL,我认为这样做是安全的。更好的方法是将它包装在一个函数和 return 一个新副本中,这样它将没有副作用
def create_my_list(mylist):
mylist = mylist[:] #to create local copy as mylist is passed by reference
#mylist is a localcopy here
for idx, r in enumerate(mylist):
if condition:
del mylist[idx]
break
return mylist
我写了一些 python 循环遍历如下列表的代码:
for idx, r in enumerate(mylist):
if condition:
del mylist[idx]
break
我的问题是,只要我有 break 语句,在循环内修改此列表(如上例)是否安全?还是我仍然应该在循环外修改列表?
是的,如果其他线程不打算并发使用 mylist,则此代码不是并发的是安全的。但只要我们有 GIL,我认为这样做是安全的。更好的方法是将它包装在一个函数和 return 一个新副本中,这样它将没有副作用
def create_my_list(mylist):
mylist = mylist[:] #to create local copy as mylist is passed by reference
#mylist is a localcopy here
for idx, r in enumerate(mylist):
if condition:
del mylist[idx]
break
return mylist