You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自行判断Python中nums[1:]遍历是否创建新子列表

如何判断for item in nums[1:]是否会创建新列表?

我不是要直接要答案,而是想知道怎么自己判断:代码for item in nums[1:]会不会让Python在内存里创建一个长度为len(nums)-1的新列表再遍历?

之前我测试过my_function(nums[1:])里传的是新子列表,但不知道怎么用类似方法判断for循环这种场景。目前我用的替代写法是通过enumerate跳过第一个元素:

for indx, item in enumerate(nums):
    if indx == 0:
       continue 
    # 处理元素的逻辑

自行判断的实用方法

1. 用id()对比内存地址

列表切片nums[1:]本身就是创建新列表的操作——不管是传给函数还是放在for循环里,本质都是先执行切片生成新列表,再用这个新列表做后续操作。你可以用id()验证对象的唯一性:

nums = [1,2,3,4]
original_id = id(nums)
slice_id = id(nums[1:])
print(original_id != slice_id)  # 输出True,说明切片结果是全新的对象

放到for循环里逻辑完全一致:Python会先执行nums[1:]生成新列表,再遍历这个新列表的元素。

2. 修改原列表看遍历结果

如果遍历的是原列表的“视图”而非新列表,修改原列表会直接影响遍历内容,但切片生成的是独立新列表,修改原列表不会改变遍历结果:

nums = [1,2,3,4]
for item in nums[1:]:
    nums[1] = 99  # 遍历过程中修改原列表的第二个元素
    print(item)  # 输出2、3、4,不会变成99,说明遍历的是切片生成的新列表

3. 用sys.getsizeof()看内存变化

切片生成新列表会占用额外内存,用sys.getsizeof()可以直观看到内存占用的变化:

import sys
nums = list(range(10000))
print(sys.getsizeof(nums))  # 原列表的内存大小
slice_nums = nums[1:]
print(sys.getsizeof(slice_nums))  # 切片后新列表的内存大小,是独立的内存块

额外说明

你用enumerate跳过第一个元素的写法,确实是直接遍历原列表,不会创建新列表,内存效率更高,适合处理大列表的场景。

内容的提问来源于stack exchange,提问作者stackoverflowed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:50:37