可以将方法调用链接到内置的'set()'吗?(那么为何不?)

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)

cod*_*ape 19

set.remove 什么都不返回(无).

您的代码将返回值赋给set.remove变量mi_set.因此,mi_set为None.


Joh*_*uhy 8

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是此规则的一个例外,由于历史原因 - 它允许您使用类似堆栈的列表.即使这样,它也会返回删除的对象,而不是列表.]