Python内存空间的堆和栈以及列表的变化逻辑

文章介绍了Python中的堆栈原理,通过列表(list)示例说明对象的内存存储和引用访问。讨论了列表删除元素的陷阱,解释了为何直接遍历并删除元素会导致不预期的结果,并提供了切片和复制列表的正确清除方法。这些知识对编写测试用例尤其重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   之前介绍了 Java存储空间的堆和栈的关系,今天介绍 Python 其实也是有同样的原理。一个对象在内存中会请求一块空间来保存数据,访问对象的时候不会直接是访问对象在内存中的数据,而是通过引用去访问。


   下面将通过 Python 列表 (list) 去举例说明,它和 Java 的数组表现形式有极度相似,只是 list 可以有不同类型所组成的集合而已。

在这里插入图片描述



lst1 = [1,2,3]
lst2 = lst1

print('原始的lst1:',lst1)
print('原始的lst2:',lst2,'\n')

lst2[0] = 666

print('更改后的lst1:',lst1)
print('更改后的lst2:',lst2)


   下面再举一个典型列表删除元素例子,假设 有 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们需要把里面10个元素全部删除,最后保留空列表。可能大家第一时间就会想到用循环的方法去实现。先测试一下结果。
   可见最后结果却是 [2,4,6,8,10] , 原因是什么呢?

当 i = 1时, lst.remove(i), remove 1, (i相当于lst[0], 执行 del lst[0] ) lst = [2,3,4,5,6,7,8,9,10]


当 i = 2时, lst.remove(i), 不可以理解为 remove 2, ( i其实相当于 lst[1], 执行 del lst[1]), lst = [2,4,5,6,7,8,9,10]

当 i = 3时, lst.remove(i), 不可以理解为 remove 3, ( i其实相当于 lst[2], 执行 del lst[2]), lst = [2,4,6,7,8,9,10] , 如此类推,最后结果为 [2,4,6,8,10]



在这里插入图片描述



   因此,如果要完美符合完全清空列表里的所有元素,可以用切片或者复制的方法去实现。

   切片法



在这里插入图片描述



lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in lst[:]:
    lst.remove(i)

print(lst)


   复制列表法



在这里插入图片描述



lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in lst.copy():
    lst.remove(i)

print(lst)


   P.S: 如上面例子可以直接删除列表里的奇数,同样也可以直接删除列表里的偶数。



在这里插入图片描述



lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in lst:
    lst.remove(i+1)

print(lst)


   当然,也可以通过添加取余条件判断去实现。



在这里插入图片描述



lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in lst:
  if i % 2 != 0:
    lst.remove(i)

print(lst)


在这里插入图片描述



lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in lst:
  if i % 2 == 0:
    lst.remove(i)

print(lst)


   以上简单介绍了 Python 堆和栈,以及列表的变化典型例子,在软件测试中编写测试用例时,会经常遇到的应用。只要理解好相对应的逻辑原理,就可以灵活运用在测试用例上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值