3 python
如果我尝试:
mi_list = ['three', 'small', 'words']
mi_set = set(mi_list)
mi_set.remove('small')
print mi_set
Run Code Online (Sandbox Code Playgroud)
我明白了:
set(['three', 'words'])
Run Code Online (Sandbox Code Playgroud)
这是我所期待的.如果我尝试:
mi_list = ['three', 'small', 'words']
mi_set = set(mi_list).remove('small')
print mi_set
Run Code Online (Sandbox Code Playgroud)
我明白了:
None
Run Code Online (Sandbox Code Playgroud)
为什么?
我怀疑有一个线索,如果我尝试删除一个不存在的元素 - 例如'big' - 会报告错误:
KeyError: 'big'
Run Code Online (Sandbox Code Playgroud)
python中有一个通用约定,导致副作用的方法返回None.示例包括list.sort,list.append,set.add,set.remove,dict.update等.
这主要是为了帮助您避免错误.假设你有一个名为mi_set的集合.如果你能写:
mi_set2 = mi_set.remove('small')
Run Code Online (Sandbox Code Playgroud)
然后读者可能会想:" mi_set2与...不同mi_set".但事实并非如此!混乱可能会导致错误共享数据结构而导致的细微错误.所以通过返回None,python强迫你记住像我上面列出的那些方法修改对象,而不是创建新对象.
另见这里的长篇讨论.虽然注意到类似的方法sorted(),并reversed()已自该线程加入.
[请注意,list.pop是此规则的一个例外,由于历史原因 - 它允许您使用类似堆栈的列表.即使这样,它也会返回删除的对象,而不是列表.]