Python 列表(list)详解|从 Java ArrayList 视角快速上手

1 阅读10分钟

Python 列表(list)详解|从 Java ArrayList 视角快速上手

对于Java后端开发者来说,处理集合类数据时,ArrayList是最常用的工具之一——它有序、可变、可存储多种类型元素,是日常开发中操作“批量数据”的核心容器。

而在Python中,列表(list) 就相当于Java中的ArrayList,甚至比ArrayList更灵活、更简洁。它同样支持有序存储、增删改查、排序反转等操作,但语法更简洁、操作更便捷,无需关注泛型、初始化容量等细节。

这篇文章就从Java开发者熟悉的ArrayList视角出发,逐一对标Python列表的定义、创建、常用操作,用对比的方式拆解差异、梳理用法,搭配全新代码示例,让你快速上手Python列表,摆脱Java思维的束缚。

一、核心认知:Python list vs Java ArrayList

在正式学习之前,先明确两者的核心共性与差异,帮你快速建立认知:

特性Python list(列表)Java ArrayList
核心定位内置可变有序集合,最常用的数据容器集合框架中的可变有序列表,需手动导入包
元素类型无限制,可存储任意类型(数字、字符串、布尔值、嵌套列表等)需指定泛型(如ArrayList),默认存储Object类型
初始化方式简洁灵活,支持直接赋值、内置函数创建需new关键字初始化,可指定初始容量
核心优势语法极简,操作便捷,无需关注底层细节可控制初始容量,性能可控,支持更多集合接口方法

简单来说:Python list 是“开箱即用”的灵活容器,而Java ArrayList 是“严谨可控”的专业容器,两者核心功能一致,但Python的用法更简洁。

二、创建列表:Python 极简 vs Java 严谨

Java中创建ArrayList,必须用new关键字,还需指定泛型(避免类型错误);而Python创建list,无需任何关键字,一行代码即可完成。

1. 基本创建(最常用)

Java ArrayList 写法
// 导入包(必须)
import java.util.ArrayList;

// 创建字符串类型的ArrayList,指定泛型
ArrayList<String> fruits = new ArrayList<>();
// 添加元素(需手动add)
fruits.add("apple");
fruits.add("banana");
fruits.add("cherry");
Python list 写法
# 直接用方括号[]创建,无需初始化、无需指定类型
fruits = ["apple", "banana", "cherry"]
# 一行完成创建+赋值,无需手动添加元素

2. 用内置函数创建

Java ArrayList 写法
// 用Arrays.asList()转换,需手动传入数组
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(10, 20, 30));
// 或创建空列表,指定初始容量(优化性能)
ArrayList<Integer> emptyNums = new ArrayList<>(10);
Python list 写法
# 用内置list()函数创建,可转换可迭代对象
nums = list((10, 20, 30))  # 转换元组为列表
# 创建空列表(两种方式,均无需指定容量)
empty_list1 = []
empty_list2 = list()

关键差异

Python list 无需导入任何包、无需指定元素类型、无需手动add初始元素,创建方式更简洁;Java ArrayList 必须导入包、指定泛型,灵活性稍弱,但类型安全性更高。

三、访问元素:Python 索引更灵活,无需越界判断?

两者都支持通过索引访问元素,且索引均从0开始,但Python新增了“反向索引”功能,无需像Java那样计算倒数位置,更便捷;同时两者都会报越界错误,需注意索引范围。

1. 正向索引(从0开始)

Java ArrayList 写法
ArrayList<String> fruits = new ArrayList<>(Arrays.asList("apple", "banana", "cherry"));
// 通过get()方法获取元素
String first = fruits.get(0);  // apple
String third = fruits.get(2);  // cherry
// 索引越界会报:IndexOutOfBoundsException
Python list 写法
fruits = ["apple", "banana", "cherry"]
# 直接用 列表[索引] 获取,无需get()方法
first = fruits[0]  # apple
third = fruits[2]  # cherry
# 索引越界会报:IndexError: list index out of range

2. Python 独有:反向索引

Java中获取倒数第一个元素,需计算索引(size()-1);Python直接用-1表示倒数第一个,-2表示倒数第二个,无需计算。

fruits = ["apple", "banana", "cherry"]
print(fruits[-1])  # 倒数第一个:cherry
print(fruits[-2])  # 倒数第二个:banana

3. 切片(Python 独有,Java 需手动遍历)

Python list 支持“切片”操作,可快速获取部分元素,形成新列表;而Java ArrayList 无此功能,需手动遍历筛选,代码冗余。

Python 切片写法
nums = [1, 2, 3, 4, 5, 6]
print(nums[1:4])  # 从索引1到3(左闭右开):[2, 3, 4]
print(nums[2:])   # 从索引2到末尾:[3, 4, 5, 6]
print(nums[:3])   # 从开头到索引2:[1, 2, 3]
print(nums[::2])  # 步长为2,隔一个取一个:[1, 3, 5]
Java 对应实现(需手动遍历)
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
// 对应Python nums[1:4],获取索引1-3的元素
ArrayList<Integer> subNums = new ArrayList<>();
for (int i = 1; i < 4; i++) {
    subNums.add(nums.get(i));
}

四、增删改查:Python 一行搞定,Java 需调用方法

列表的核心操作是增删改查,Python 用极简语法实现,无需像Java那样调用大量方法,逻辑更直观。

1. 修改元素

Java ArrayList 写法
ArrayList<String> fruits = new ArrayList<>(Arrays.asList("apple", "banana", "cherry"));
// 用set()方法修改指定索引元素
fruits.set(1, "orange");
System.out.println(fruits);  // [apple, orange, cherry]
Python list 写法
fruits = ["apple", "banana", "cherry"]
# 直接通过索引赋值修改,无需调用方法
fruits[1] = "orange"
print(fruits)  # [apple, orange, cherry]

2. 添加元素(3种常用方式)

方式1:末尾添加(最常用)
// Java:add()方法
fruits.add("peach");  // 末尾添加单个元素
# Python:append()方法,语法更简洁
fruits.append("peach")
方式2:指定位置插入
// Java:add(索引, 元素)
fruits.add(1, "mango");  // 索引1处插入mango
# Python:insert(索引, 元素)
fruits.insert(1, "mango")
方式3:合并两个列表
// Java:addAll()方法
ArrayList<String> moreFruits = new ArrayList<>(Arrays.asList("grape", "kiwi"));
fruits.addAll(moreFruits);
# Python:extend()方法,或直接用+拼接
more_fruits = ["grape", "kiwi"]
fruits.extend(more_fruits)
# 或简写:fruits += more_fruits

3. 删除元素(4种常用方式)

方式1:删除指定索引元素
// Java:remove(索引),返回被删除元素
fruits.remove(1);  // 删除索引1的元素
# Python:del关键字,或pop(索引)
del fruits[1]  # 仅删除,不返回
item = fruits.pop(1)  # 删除并返回被删除元素
方式2:删除指定值的元素
// Java:remove(元素),删除第一个匹配项
fruits.remove("apple");
# Python:remove(元素),用法与Java一致
fruits.remove("apple")
方式3:清空列表
// Java:clear()方法
fruits.clear();
# Python:clear()方法,用法一致
fruits.clear()

五、遍历列表:Python 更简洁,无需关注索引

Java遍历ArrayList,常用for循环(普通for、增强for);Python遍历list,除了类似增强for的遍历,还支持枚举遍历,语法更灵活。

1. 普通遍历(仅获取元素)

// Java:增强for循环
for (String fruit : fruits) {
    System.out.println(fruit);
}
# Python:for-in循环,更简洁
for fruit in fruits:
    print(fruit)

2. 带索引遍历

// Java:普通for循环,通过索引获取元素
for (int i = 0; i < fruits.size(); i++) {
    System.out.println("索引" + i + ":" + fruits.get(i));
}
# Python:enumerate()函数,直接获取索引和元素
for index, fruit in enumerate(fruits):
    print(f"索引{index}{fruit}")

六、排序与反转:Python 一行搞定,Java 需借助工具类

Java中排序需借助Collections工具类,反转也需手动实现或调用工具方法;Python list 内置排序、反转方法,一行代码即可完成。

1. 排序

Java 写法
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(3, 1, 4, 2));
// 升序排序(Collections工具类)
Collections.sort(nums);
// 降序排序(需传入比较器)
Collections.sort(nums, Collections.reverseOrder());
Python 写法
nums = [3, 1, 4, 2]
# 升序排序(修改原列表)
nums.sort()
# 降序排序(修改原列表)
nums.sort(reverse=True)
# 临时排序(不修改原列表,返回新列表)
sorted_nums = sorted(nums, reverse=True)

2. 反转列表

Java 写法
// 借助Collections工具类
Collections.reverse(nums);
Python 写法
# 内置reverse()方法,修改原列表
nums.reverse()
# 或用切片反转(不修改原列表,返回新列表)
reversed_nums = nums[::-1]

七、复制列表:浅拷贝差异(Java vs Python)

无论是Java ArrayList还是Python list,复制列表都需注意“浅拷贝”的特性——仅复制外层容器,不复制嵌套结构(如子列表、对象)。

Java 浅拷贝
ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
// 浅拷贝(new ArrayList<>(a))
ArrayList<Integer> b = new ArrayList<>(a);
b.add(4);
System.out.println(a);  // [1,2,3](原列表不变)
Python 浅拷贝(3种方式)
a = [1, 2, 3]
# 方式1:copy()方法
b = a.copy()
# 方式2:切片拷贝
c = a[:]
# 方式3:list()函数
d = list(a)

b.add(4)
print(a)  # [1,2,3](原列表不变)

关键提醒

若列表中包含嵌套结构(如子列表),浅拷贝不会复制子列表,修改子列表内容会影响原列表,这一点Java和Python完全一致。

八、嵌套列表(二维列表):Python 更直观

Java中实现二维列表,需创建“ArrayList嵌套ArrayList”,语法繁琐;Python嵌套列表直接用方括号嵌套,写法更简洁,访问也更直观。

Java 二维列表
// 创建二维列表(ArrayList嵌套ArrayList)
ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
// 添加子列表
matrix.add(new ArrayList<>(Arrays.asList(1, 2, 3)));
matrix.add(new ArrayList<>(Arrays.asList(4, 5, 6)));
// 访问子列表元素(索引1的子列表,索引2的元素)
int num = matrix.get(1).get(2);  // 6
Python 二维列表
# 直接嵌套方括号,一行创建二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 访问元素(列表[外层索引][内层索引])
num = matrix[1][2]  # 6

九、实战案例:学生成绩分析(Java vs Python)

用一个简单的学生成绩分析案例,直观感受两者的写法差异,实现“计算平均分、最高分、最低分、排序”功能。

Java 实现
import java.util.ArrayList;
import java.util.Collections;

public class ScoreAnalysis {
    public static void main(String[] args) {
        // 创建成绩列表
        ArrayList<Integer> scores = new ArrayList<>(Arrays.asList(85, 92, 78, 90, 88, 76, 95));
        
        // 1. 平均分(需手动求和)
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        double avg = (double) sum / scores.size();
        
        // 2. 最高分、最低分(借助Collections)
        int maxScore = Collections.max(scores);
        int minScore = Collections.min(scores);
        
        // 3. 降序排序
        ArrayList<Integer> sortedScores = new ArrayList<>(scores);
        Collections.sort(sortedScores, Collections.reverseOrder());
        
        // 输出结果
        System.out.printf("平均分:%.2f\n", avg);
        System.out.println("最高分:" + maxScore);
        System.out.println("最低分:" + minScore);
        System.out.println("降序排序:" + sortedScores);
    }
}
Python 实现
# 创建成绩列表
scores = [85, 92, 78, 90, 88, 76, 95]

# 1. 平均分(内置sum()、len()函数)
avg = sum(scores) / len(scores)

# 2. 最高分、最低分(内置max()、min()函数)
max_score = max(scores)
min_score = min(scores)

# 3. 降序排序(内置sorted()函数)
sorted_scores = sorted(scores, reverse=True)

# 输出结果
print(f"平均分:{avg:.2f}")
print(f"最高分:{max_score}")
print(f"最低分:{min_score}")
print(f"降序排序:{sorted_scores}")

对比可见:Python 借助内置函数,无需手动求和、无需借助工具类,代码量减少一半,逻辑更直观。

十、核心差异总结(Java 开发者速记)

  • 创建:Python list 用[]/list(),无需new、无需泛型;Java ArrayList 需new、指定泛型。
  • 访问:Python 支持反向索引、切片;Java 需手动计算索引、遍历筛选。
  • 操作:Python 增删改查语法极简,无需过多方法;Java 需调用add/set/remove等方法。
  • 工具:Python 内置sum/max/min/sorted等函数;Java 需借助Collections工具类。
  • 嵌套:Python 二维列表写法直观;Java 需嵌套ArrayList,语法繁琐。

十一、小结

对于Java开发者来说,学习Python list 其实很简单——它本质就是“简化版的ArrayList”,保留了ArrayList的核心功能,去掉了繁琐的语法约束(泛型、new关键字、工具类调用),增加了更灵活的操作(反向索引、切片)。

记住一个核心:Python list 追求“简洁高效”,能一行搞定的绝不写多行,无需关注底层细节,专注业务逻辑即可。

掌握列表的创建、增删改查、排序反转等操作,就能应对Python中大部分集合类数据的处理场景,为后续学习字典、集合等数据结构打下坚实基础。