Pythonic交换?

问题描述

我可能会在示例代码中更改一件事:如果您要使用一些长名称(例如self.memberlist再次使用over),通常更容易将别名(“赋值”)命名为短名称。因此,例如,代替冗长而又难以阅读的内容:

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)的三种可能性[[不是负数,但是- 为什么不呢?切片器将需要更改以解决此问题?]]。但是,在生产代码中使用这种奇特的方法通常会显得过大且毫无根据,与简单的方法相比,使事情变得更加模糊和难以维护。

记住,简单胜于复杂

解决方法

我发现我必须在python中执行交换,并且我写这样的东西。

arr[first],arr[second] = arr[second],arr[first]

我想这不是pythonic。有人知道如何在python中更优雅地进行交换吗?

编辑: 我认为另一个例子将显示我的怀疑

self.memberlist[someindexA],self.memberlist[someindexB] = self.memberlist[someindexB],self.memberlist[someindexA]

这是python中唯一可用的交换解决方案吗?我确实搜索了很多,但找不到一个好的答案…

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...