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

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


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



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

print(原始的lst1:,lst1)
print(原始的lst2:,lst2,
)

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 堆和栈,以及列表的变化典型例子,在软件测试中编写测试用例时,会经常遇到的应用。只要理解好相对应的逻辑原理,就可以灵活运用在测试用例上。

经验分享 程序员 微信小程序 职场和发展