在你的示例代码中,我可能会改变一件事情:如果你要多次使用像self.memberlist
这样的长名称,通常更易读的方法是先给它分配一个较短的别名。因此,例如,可以使用以下较短、易于阅读的代码:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
你可以编写如下代码:
L = self.memberlist
L[someindexA], L[someindexB] = L[someindexB], L[someindexA]
请记住Python是按引用工作的,所以L指向完全相同的对象,与self.memberlist
不是副本(同样,无论列表有多长,赋值都非常快,因为它不会被复制,只是增加了一个引用)。
我认为没有必要增加任何进一步的复杂性,尽管当然可以轻易地构思出一些花哨的东西,例如(对于a,b“正常”的索引>=0
):
def slicer(a, b):
return slice(a, b+cmp(b,a), b-a), slice(b, a+cmp(a,b), a-b)
back, forth = slicer(someindexA, someindexB)
self.memberlist[back] = self.memberlist[forth]
我认为弄清这些“高级”用法是一个不错的想法,有用的头脑锻炼和很有趣——我建议感兴趣的读者,在掌握了一般思路后,重点关注那些+cmp
的作用以及它们如何使三种可能性(a>b、a<b、a==b)的工作[[虽然对于负索引不起作用——为什么不起作用,slicer需要如何更改来解决这个问题?]]. 但在生产代码中使用这种花哨的方法通常会过度设计且毫无必要,会让事情变得更加混乱和难以维护,而不如简单明了的方法。
记住,简单胜于复杂!