我想知道为什么Python的extend/append方法不返回对结果列表的引用.要使用last元素构建list的所有组合的字符串,我想写简单:
for i in range(l, 0, -1):
yield " ".join(src[0:i-1].append(src[-1]))
Run Code Online (Sandbox Code Playgroud)
但我得到了:TypeError.而是使用以下代码与中间变量:
for i in range(l, 0, -1):
sub = src[0:i-1]
sub.append(src[-1])
yield " ".join(sub)
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我
Python中的变异方法没有返回对它们已经变异的对象的引用的原因可以在Command-Query Separation原则(简称CQS)中找到.Python并没有像Meyer的Eiffel语言那样彻底应用CQS(因为 - 根据Python的Zen,又称import this"实用性超过纯度"):例如,somelist.pop()确实返回刚刚弹出的元素(仍然不是刚才的容器)突变;-),而在艾菲尔弹出堆栈没有返回值(在您需要流行和使用的顶级元素通常情况下,您第一次使用"查询"在顶部偷看,后来"命令"让顶部消失".
CQS的深层动机并非真正"变异者应该没有任何有用的东西":相反,它是"查询应该没有副作用".保持区别(无论是严格的还是"更多的指导而不是规则")应该帮助你记住它,它确实在某种程度上起作用(捕捉一些偶然的错误),尽管它有时会感到不方便你已经习惯了流畅的"表达和陈述是一回事"的语言.
CQS(广义上讲......)的另一个方面是语句和表达式之间的区别.同样,这并没有严格应用 - 表达式可以在语句可以使用的地方使用,偶尔会隐藏错误,例如当有人忘记调用他们需要的函数时foo(),不仅仅是foo;-).但是,例如(从C,Perl中,等完全不同),你不能轻易而在同一测试它(分配的东西if(a=foo())...),这是偶尔不方便但并赶上其他种类的意外错误.
嗯,也许更换:
src[0:i-1].append(src[-1])
Run Code Online (Sandbox Code Playgroud)
有:
src[0:i-1] + src[-1:] #note the trailing ":", we want a list not an element
Run Code Online (Sandbox Code Playgroud)