如何自行判断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
相关产品推荐
相关产品推荐

