Python list添加元素的方法及区别

 

Python list添加元素的方法及区别

定义两个列表(分别是 list1 和 list3),并分别使用 +、extend()、append() 对这两个 list 进行操做,其操做的结果赋值给 l2。实例代码以下:
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
print(list1,id(list1))

print("1.----------------")

#比较 list 中添加元素的几种方法的用法和区别
list3 = [6,7]
l2 = list1 + list3
print(l2,id(l2))

print("2.----------------")

l2 = list1.extend(list3)
print(l2,id(l2))
print(list1,id(list1))

print("3.----------------")

l2 = list1.append(list3)
print(l2,id(l2))
print(list1,id(list1))
输出结果为:

[1, 4, 'hello', 3.4, 'yes', [1, 2]] 2251638471496
1.----------------
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251645237064
2.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251638471496
3.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7, [6, 7]] 2251638471496python

根据输出结果,能够分析出如下几个结论:
  1. 使用“+”号链接的列表,是将 list3 中的元素放在 list 的后面获得的 l2。而且 l2 的内存地址值与 list1 并不同,这代表 l2 是一个从新生成的列表。
  2. 使用 extend 处理后获得的 l2 是 none。代表 extend 没有返回值,并不能使用链式表达式。即 extend 千万不能放在等式的右侧,这是编程时常犯的错误,必定要引发注意。
  3. extend 处理以后, list1 的内容与使用“+”号生成的 l2 是同样的。但 list1 的地址在操做先后并无变化,这代表 extend 的处理仅仅是改变了 list1,而没有从新建立一个 list。从这个角度来看,extend 的效率要高于“+”号。
  4. 从 append 的结果能够看出,append 的做用是将 list3 总体当成一个元素追加到 list1 后面,这与 extend 和“+”号的功能彻底不一样,这一点也须要注意。

Python list删除操做

接下来演示有关 del 的基本用法,实例代码以下:
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
print(list1)
del list1[2:5]
print(list1)
del list1[2]
print(list1)
输出结果为:

[1, 4, 'hello', 3.4, 'yes', [1, 2]]
[1, 4, [1, 2]]
[1, 4]编程

这 3 行输出分别是 list1 的原始内容、删除一部分切片内容、删除指定索引内容。能够看到,del 关键字按照指定的位置删掉了指定的内容。

须要注意的是,在使用 del 关键字时,必定要搞清楚,删除的究竟是变量仍是数据。例如,下面代码演示和删除变量的方法:
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
print(id(l2),id(list1))
del list1
print(l2)
print(list1)
运行结果以下:

1765451922248 1765451922248
[1, 4, 'hello', 3.4, 'yes', [1, 2]]
Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\demo.py", line 8, in <module>
    print(list1)
NameError: name 'list1' is not definedapp

第一行输出的内容是 l2 和 list1 的地址,能够看到它们是相同的,说明 l2 和 list1 之间的赋值仅仅是传递内存地址。接下来将 list1 删掉,并打印 l2,能够看到,l2 所指向的内存数据仍是存在的,这代表 del 删除 list1 时仅仅是销毁了变量 list1,并无删除指定的数据。

除了删除变量,其余的删除都是删除数据,好比将列表中数据所有清空,实现代码以下:
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
l3 = l2
del l2[:]
print(l2)
print(l3)
输出结果为:

[]
[]函数

能够看到,l3 和 l2 执行一样的内存地址,当 l2 被清空以后,l3 的内容也被清空了。这代表内存中的数据真正改变了。

另外,在实际过程当中,即使使用 del 关键字删除了指定变量,且该变量所占用的内存再没有其余变量使用,此内存空间也不会真正地被系统回收并进行二次使用,它只是会被标记为无效内存。

若是想让系统回收这些可用的内存,须要借助 gc 库中的 collect() 函数。例如:
#引入gc库
import gc
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
del list1
#回收内存地址
gc.collect()
相关文章
相关标签/搜索