【问题标题】:How are python lists different from Java arrayspython列表与Java数组有何不同
【发布时间】:2021-03-21 16:30:42
【问题描述】:

众所周知,数组以连续的方式将数据存储在内存中,即存储的数据(数组的元素)是连续的,不会随机存储在不同的地址。这就是我们不能动态改变数组大小的原因。但是在 python 列表的情况下,可以根据需要更改数组的大小。那么,python 列表是否也以连续的方式存储数据,或者它们是否使用一些不同的方法来存储数据?此外,数组中所有数据元素的大小也是相同的,例如在 java 或 c++ 中,即数组的所有元素消耗相同数量的内存,我们清楚地知道在 python 中情况并非如此。可以在同一个列表中存储不同的数据类型。所以,基本上,我的问题是,python 中的列表和 java 中的数组(或任何其他语言,如 c++ 或 c)之间的根本区别是什么。非常感谢您的帮助。

【问题讨论】:

  • 也可以查看java.util.ArrayList
  • 请注意,在 java 中,数组是一个对象。所以不能说python vs java等,因为java在这方面和c、c++不一样
  • 请注意,在 Java 中,数组只能保存原语或引用。也与 C 和 C++ 根本不同。基本上,Java 数组和 C 数组的唯一共同点是语法相似且大小固定。
  • Python 列表是...列表。它们具有动态大小,因此更类似于 Java ArrayList 或 C++ vector

标签: java python arrays list data-structures


【解决方案1】:

尽管人们将 Python 列表与 Java 中的数组进行比较,但实际上列表更像 Java 中的 ArrayLists(或 C++ 中的向量)。 Python 中的列表存储指向对象的指针而不是对象本身,这就是为什么它们可以存储异构类型([1,2,3,'x',"hello"])。因此,从技术上讲,列表仍然存储特定大小和类型的元素(指针),但这些指针可以指向任何类型、大小和值的对象。

Python 中的这些可变长度列表在列表头结构中保留了一个指向自身的指针及其长度,这与指数过度分配一起使用,因此代码可以具有追加/删除操作的线性时间复杂度。

过度分配内存用于避免多次调整列表大小(例如,在每次追加操作之后)。列表的增长模式类似于:0、4、8、16、25、35、46、58、72、88,...

对于删除/弹出操作类似,如果新大小小于分配大小的一半,则列表会缩小。虽然在从非终端位置删除元素的情况下会增加对列表进行切片的额外成本。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多