运行时错误';设置迭代期间更改的大小';用python

运行时错误';设置迭代期间更改的大小';用python,python,Python,我们可以在java中的'for'循环中使用set.iterator().remove()。相比之下,如何编写类似的python代码 def fun1(): a=set(range(10)) for num in a: if(num%2==0): a.remove(num) print(a) def fun2(): a=range(10) for num in a: if(num%2==0):

我们可以在java中的'for'循环中使用
set.iterator().remove()。相比之下,如何编写类似的python代码

def fun1():
    a=set(range(10))
    for num in a:
        if(num%2==0):
            a.remove(num)
    print(a)

def fun2():
    a=range(10)
    for num in a:
        if(num%2==0):
            a.remove(num)
    print(a)

#RuntimeError: Set changed size during iteration
fun1()

#works well
fun2()
这应该起作用:

def fun3():
    a = set(range(10))
    return set(num for num in a if num % 2)

print(fun3())

答案使用,
num for num in a if num%2
,过滤
a

的成员,是否添加另一个列表参数<代码>列表(设置(范围(10)))
用于第一个函数,然后将其更改回原来的值。或者,您可以复制集合并使用它进行迭代。如前所述,您可以为元组(a)中的num创建一个副本:有一个关于如何为list:创建副本的讨论,对于set,它应该是similiar@tdelaney
元组(a)
列表(a)
似乎占用了新的内存空间来存储集合的元素,当集合很大时,这是不必要的。@yichudu但被接受的答案做的几乎是相同的事情。它有点小,因为您过滤掉了元素,但有两个集合在函数返回时占用了内存。区别在于我的解决方案修改了现有的集合,而接受的答案创建了一个新的集合。我不知道在你的例子中哪个更重要,但我的例子更接近java例子。这很好,但应该注意的是,它并没有适当地修改集合。那还不错。。。但与java示例不同。