【问题标题】:Python "IN PLACE" functionsPython“就地”函数
【发布时间】:2011-07-16 03:01:15
【问题描述】:

Python 中的某些函数运行“IN PLACE”的具体原因是什么,例如[].sort[].reverse,而其他一些函数例如[].append 则不是?

【问题讨论】:

  • 根据什么定义,[].append 不能“就地”工作?
  • append 是否返回列表的新副本,而旧的副本保持不变?
  • help([].sort) 明确地声明排序发生在“原地”,但 help([].append) 不会...
  • 这是因为排序算法经常被归类为“就地”和“非就地”,而[].append 显然只会修改现有的数据结构,除非它是不可变的。 en.wikipedia.org/wiki/In-place_sorting
  • @Guandalino:但两者都在原地运行。也许.append 的文档中没有说明它,因为非就地版本将被称为concat(实际上是+ 运算符)。

标签: python in-place


【解决方案1】:

根据我的 Programming Python 4th edition:

默认情况下,pop 等价于 获取,然后删除,最后一个 偏移量 -1 处的项目。带着论据, pop 删除并返回项目 那个偏移量—list.pop(-1) 是一样的 作为 list.pop()。对于就地更改 追加、插入、删除等操作, 和pop,没有创建新列表 内存,所以执行很快 (性能可能进一步取决于 哪一端是“顶部”,但这在 转取决于 Python 的当前列表 实施和测量 我们稍后会探讨的概念)。

实际上有一整节专门讨论这个问题,但这几乎可以回答你的问题。

【讨论】:

    【解决方案2】:

    in-place”是指一种排序算法,只使用存储项目列表所需的内存加上一些小常数。 Append 不是排序算法,因此“就地”没有意义,或者至少不会意味着同样的事情。您在排序时混淆了“就地”排序以及它是否返回对新对象的引用或同一对象的修改版本。

    【讨论】:

    • 在提到排序算法或更一般地,重新排列数组/列表的算法时,这不是“就地”的使用方式。
    • 谢谢,但我在半小时前的评论(关于问题)中链接到那篇文章。我说的是现有的排序算法,例如heapsort,与quicksort 的典型实现相比。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多