您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Pythonic交换?

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 2022/1/1 18:53:16 有503人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶