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