我可能会在您的示例代码中更改一件事:如果您要使用一些长名称,例如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 "normal" indices >=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) [[不适用于负索引,虽然 - 为什么不,切片器需要如何更改才能解决这个问题?]]。但是在生产代码中使用这种奇特的方法通常会过度杀伤力并且非常没有根据,这使得事情比简单直接的方法更加模糊和难以维护。
请记住,简单胜于复杂!