Python-添加列表元素的方法

append()函数

      append函数用于在列表末尾添加元素,其基本用法为:

list = [1, 2, 3]
print(list)
list.append(4)
print(list)

      打印结果:

[1, 2, 3]
[1, 2, 3, 4]

      python列表支持添加不同类型的元素,包括普通类型(数值、字符串)和集合类型(列表、元组等)如下:

list = [1, 2, 3]
print(list)
list.append('hank')
print(list)

      打印结果:

[1, 2, 3]
[1, 2, 3, 'hank']

      除此外,python列表还支持列表嵌套,如下:

list1 = [1, 2, 3]
print(list1)
list2 = ['hank', 'mark']
list1.append(list2)
print(list1)

      打印结果:

[1, 2, 3]
[1, 2, 3, ['hank', 'mark']]

      需要注意的是,使用append()函数添加列表时,是添加列表的引用地址,而不是添加列表的内容。当被添加的列表被修改,添加后的列表也会同步发生变化,如下:

list1 = [1, 2, 3]
print(list1)
list2 = ['hank', 'mark']
list1.append(list2)
print(list1)
list2.append('alice')
print(list1)

      打印结果:

[1, 2, 3]
[1, 2, 3, ['hank', 'mark']]
[1, 2, 3, ['hank', 'mark', 'alice']]

      可以看到,当list2发生变化时,list1也同步发生了变化,使用id()函数查看一下:

list1 = [1, 2, 3]
list2 = ['hank', 'mark']
list1.append(list2)
print(list2, id(list2))
print(list1, id(list1[1]))

      打印结果:

['hank', 'mark'] 140607985072768
[1, 2, 3, ['hank', 'mark']] 140607894028560

      可以看到,list2的地址和list[1]的地址是相同的,这是因为append(list2)添加的是list2的引用地址,并不是list2的内容。即append()函数进行了浅拷贝,有时程序需要的是对列表的深拷贝,尤其在涉及递归和回溯时。

copy.deepcopy()

      可以使用copy.deepcopy()函数深拷贝列表的内容而不是列表的引用地址,如下:

list1 = [1, 2, 3]
list2 = ['hank', 'mark']
list1.append(copy.deepcopy(list2))
print(list2,id(list2))
print(list1, id(list1[1]))
list2.append('alice')
print(list1)

      打印结果:

['hank', 'mark'] 140465798184640
[1, 2, 3, ['hank', 'mark']] 140465697685776
[1, 2, 3, ['hank', 'mark']]

      可以看到,list2的地址和list1[1]的地址并不相同,说明copy.deepcopy()拷贝的是列表list2的内容。此外可以看到,当list2的内容发生改变时,并不会影响list1的内容,'alice'并未添加进list1中。

使用切片特性list[:]

      切片可以对列表元素进行复制,产生新的列表对象,如下:

list1 = [1, 2, 3]
print(list1, id(list1))
print(list1[:], id(list1[:]))

      打印结果:

[1, 2, 3] 140197983479168
[1, 2, 3] 140197983478976

      可以看到,list1[:]产生了新的列表对象,与list1的内存地址并不相同,因此也可以解决append函数的深浅拷贝问题,如下:

list1 = [1, 2, 3]
list2 = ['hank', 'mark']
list1.append(list2[:])
print(list1)
list2.append('alice')
print(list1)

      打印结果:

[1, 2, 3, ['hank', 'mark']]
[1, 2, 3, ['hank', 'mark']]

      可以看到,当list2发生变化时,添加了list2的list1并未发生变化,这是因为list1实际添加的是list2[:],是一个内容和list2相同的新的列表对象,并不是list2的引用地址。


extend()函数

      extend()函数也是在列表末尾添加元素,但是其参数只能是列表,即将被添加的列表元素拷贝进调用extend函数的列表中,可以简单理解为将两个列表进行了合并,如下:

list1 = [1, 2, 3]
print(list1)
list2 = ['hank', 'mark']
list1.extend(list2)
print(list1)

      打印结果:

[1, 2, 3]
[1, 2, 3, 'hank', 'mark']

      extend函数拷贝的是元素内容,不存在深浅拷贝问题,如下:

list1 = [1, 2, 3]
print(list1)
list2 = ['hank', 'mark']
list1.extend(list2)
print(list1)
list2.append('alice')
print(list1)

      打印结果:

[1, 2, 3]
[1, 2, 3, 'hank', 'mark']
[1, 2, 3, 'hank', 'mark']

      可以看到,list2发生变化时,list1并未发生变化。


+运算符

      +运算符是将两个列表相加(拼接),返回一个新的列表对象,会消耗额外的内存,如下:

list1 = [1, 2, 3]
list2 = ['hank', 'mark']
print(list1, id(list1))
print(list2, id(list2))
print(list1 + list2, id(list1 + list2))

      打印结果:

[1, 2, 3] 140222989918720
['hank', 'mark'] 140222989925696
[1, 2, 3, 'hank', 'mark'] 140222989916160

      可以看到,+使得list1和list2发生了拼接,并且产生了新的列表对象,占用了新的内存地址。

list1 = [1, 2, 3]
print(list1, id(list1))
list2 = ['hank', 'mark']
list1 = list1 + list2
print(list1, id(list1))

      打印结果:

[1, 2, 3] 140420138983616
[1, 2, 3, 'hank', 'mark'] 140420138983424

      可以看到list1的地址发生了变化,使用了新的内存地址。

猜你喜欢

转载自blog.csdn.net/fzz97_/article/details/128888486