Python 列表与 Java 数组有何不同

问题描述 投票:0回答:2

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

java python arrays list data-structures
2个回答
2
投票

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

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

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

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


0
投票

以下是 Python 列表和 Java 数组之间主要区别的细分,包括解释和示例:

  1. 固定尺寸与动态尺寸

Java 数组:具有固定大小,在创建数组时必须声明该大小。您无法添加或删除超出此大小的元素。

Java

int[] numbers = new int[5]; // Array can only hold 5 integers

Python 列表:可以动态增长或收缩。您可以根据需要添加或删除元素。

Python

numbers = [1, 2, 3]  # List initialized
numbers.append(4)    # Adding an element
  1. 同质与异质类型

Java 数组:必须存储相同数据类型的元素。

Java

String[] names = {"Alice", "Bob"}; 
int[] ages = {25, 30};

Python 列表:可以存储不同数据类型的元素。

Python

my_list = [10, "hello", 3.14, True] 
  1. 可变性

Java数组:数组创建后可以更改数组的内容。您可以更改单个元素的值。

Java

int[] numbers = {1, 2, 3};
number[0] = 5; // Now numbers is {5, 2, 3}

Python 列表:列表是完全可变的。您可以更改元素、添加元素、删除元素以及重新排列它们。

Python

my_list = [1, 2, 3]
my_list[1] = "new value"  # Now my_list is [1, "new value", 3]
my_list.remove(3)         # Now my_list is [1, "new value"]
  1. 效率和性能

Java 数组:通常在存储同类数据时内存效率更高,尤其是原始数据类型。它们通过索引提供对元素的快速访问。

Python 列表:更灵活,但由于其动态特性和存储不同类型的能力而产生一些开销。这种灵活性会在内存方面付出一点代价,在某些情况下还会牺牲速度。

  1. 功能性

Python 列表:拥有丰富的内置方法,使常用操作变得非常方便:

append() to add an element
remove() to remove an element
sort() to sort in place
reverse() to reverse in place

还有更多... Java 数组:需要使用外部实用程序类(如数组)来执行排序、搜索等高级操作。

Java

Arrays.sort(my_array);

Python的数组模块 Python 有一个数组模块,它提供类似于 Java 数组的类似数组的结构,用于存储同质数据类型。然而,即使这些数组对象也比 Java 的数组更灵活,允许调整大小。

总结 从本质上讲,Python 列表为通用编程提供了更多的多功能性,而 Java 数组更适合提前知道数据大小并且需要对同质数据的特定操作有更好性能的场景。

© www.soinside.com 2019 - 2024. All rights reserved.