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的地址发生了变化,使用了新的内存地址。
文章介绍了Python中列表的append()函数用于在列表末尾添加元素,可能会导致浅拷贝的问题。extend()函数则是将另一个列表的元素添加到原列表,而+运算符则用于列表拼接,创建新列表。文章强调了深拷贝与浅拷贝的区别,并给出了使用copy.deepcopy()和切片操作实现深拷贝的方法。

9432

被折叠的 条评论
为什么被折叠?



