为何自定义inserta函数调用后返回None?求技术解析
问题根源
Python 的 set.add() 方法是原地修改集合,它的返回值固定为 None——不管集合有没有被修改,这个方法都不会返回新集合或者修改后的集合。你代码里把 add() 的返回值赋值给了 a,最后返回 a,自然每次得到的都是 None。
顺便提一句:你用的是普通集合,本身不允许重复元素,所以添加已存在的2不会改变集合内容,但这不是返回None的原因——哪怕你加的是新元素,add()依然返回None。
修正方法
根据你的需求选下面两种方式:
方式1:直接返回修改后的原集合
集合是可变对象,函数里的修改会直接作用于原集合,直接返回传入的集合即可:
x = set([1,2,3]) def inserta(multiconjunto, elemento): multiconjunto.add(elemento) return multiconjunto mc1 = inserta(x, 2) print(mc1) # 输出 {1,2,3},因为2本来就在集合里
如果添加新元素比如4,就会输出{1,2,3,4}。
方式2:返回集合副本(不改动原集合)
要是不想修改原来的集合,可以先复制一份,给副本加元素后返回:
x = set([1,2,3]) def inserta(multiconjunto, elemento): new_set = multiconjunto.copy() new_set.add(elemento) return new_set mc1 = inserta(x, 2) print(mc1) # 输出 {1,2,3} print(x) # 原集合还是 {1,2,3},没被修改
如果你的真实需求是实现支持重复元素的多集合,直接用标准库的collections.Counter更方便:
from collections import Counter x = Counter([1,2,3]) def inserta(multiconjunto, elemento): multiconjunto[elemento] += 1 return multiconjunto mc1 = inserta(x, 2) print(mc1) # 输出 Counter({1:1, 2:2, 3:1})
内容的提问来源于stack exchange,提问作者Sebastian Nin
相关产品推荐
相关产品推荐

