【python进阶】对列表使用+和*进行拼接?这个陷阱要小心

简介: 在本文中,我们介绍了对列表使用+和*进行拼接以及在利用其不当的过程中,可能会导致的问题希望大家都能够理解并注意。

📚引言

🙋‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨‍🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,亚太数学建模国家二等奖🏅。

✍️研究方向:复杂网络科学

🏆兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。

python作为一款深受大家喜爱的语言,一直都在时代的风口浪尖吸引了很多的人学习。在我们学习python的过程中,有一个非常常见的语法,那就是利用+和*进行序列的拼接以及其他操作。但是孰不住这个操作存在一个陷阱,今天就带大家从使用+和*进行拼接出发认识一个大家非常容易犯的代码错误。话不多说我们开始吧。

📖对序列使用+和*

在编写python的过程中,我们默认python的序列是支持+和*的操作的。例如在对序列相加的过程中,+号两边的序列需要是相同类型的序列,python会为我们创建一个相同类型的序列作为拼接的结果。请看下面这个例子:

string_01 = 'abc'
string_02 = 'def'

print(string_01 * 5)
print(string_01 + string_02)

>>>abcabcabcabcabc
>>>abcdef

另外,我们还可以在列表中使用上述代码进行拼接与合并,如下所示:

list_01 = [i for i in range(3)]
list_02 = [i for i in range(4,7)]

print(list_01 * 3)
print(list_01 + list_02)

>>>[0, 1, 2, 0, 1, 2, 0, 1, 2]
>>>[0, 1, 2, 4, 5, 6]

在这个过程当中,python不会修改原有的序列而是会新开辟一个空间存储合并后或者拼接后的序列。

📖由列表组成的列表

在有些情况下,可能需要我们建立一个嵌套着几个列表的列表,例如需要我们建立一个用于存储员工信息的嵌套列表。请看下面的代码:

worker_information = [['Nan'] * 3 for i in range(3)]
print(worker_information)

>>> [['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
注意:上述代码中利用了生成器表达式来完成,还不是很了解的小伙伴可以点击下方文章了解一下。
【python进阶】你还在使用for循环新建数组?生成器表达式帮你一行解决

当我们想要修改其中的一项时,只需要进行常规的赋值就可以了,如下所示:

worker_information[0][0] = '王刚'
worker_information[0][1] = '20岁'
print(worker_information)

>>>[['王刚', '20岁', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]

📖嵌套列表创建的陷阱

我们通过上述代码中的+和的应用使得我们快速创建了嵌套列表。但是,要注意当使用诸如an的表达式时,a不能是同一个引用。下面我们来看一个具体的例子来更好的说明这种情况,请看下面这段代码:

worker_information_bug = [['Nan'] * 3] * 3
print(worker_information_bug)

worker_information_bug[0][0] = '王刚'
print(worker_information_bug)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王刚', 'Nan', 'Nan'], ['王刚', 'Nan', 'Nan'], ['王刚', 'Nan', 'Nan']]

程序出现了意想不到的结果,当我们改变嵌套列表中的一个元素时,所有列表的元素都发生了改变。下面这段代码也是典型的错误,如下:

row = ['Nan'] * 3
worker_information_bug_02 = []
for i in range(3):
    worker_information_bug_02.append(row)

print(worker_information_bug_02)

worker_information_bug_02[0][0] = '王刚'
print(worker_information_bug_02)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王刚', 'Nan', 'Nan'], ['王刚', 'Nan', 'Nan'], ['王刚', 'Nan', 'Nan']]

上述两段代码的错误都是由于重复了同一个引用所导致的,在[['Nan'] * 3] 中我们建立了一个列表,但当这个结构被嵌套成[['Nan'] * 3] * 3时,其实我们只是在一个列表中放入了三个同一个列表的引用,而不是创建了三个列表。正确的做法应该如下:

worker_information_bug_02 = []
for i in range(3):
    # 每次循环都建立新的列表
    row = ['Nan'] * 3
    worker_information_bug_02.append(row)

print(worker_information_bug_02)

worker_information_bug_02[0][0] = '王刚'
print(worker_information_bug_02)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王刚', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]

在上述代码中,我们在每次循环都建立了新的列表,这能够保证我们的修改正常进行。

📍总结

在本文中,我们介绍了对列表使用+和*进行拼接以及在利用其不当的过程中,可能会导致的问题希望大家都能够理解并注意。

如果你觉得本文对你有帮助或者有什么疑问的地方,欢迎你私信我与我讨论或者给个评论点赞收藏,我们下次再见。

相关文章
|
5天前
|
存储 索引 Python
深度解密 Python 列表的实现原理
深度解密 Python 列表的实现原理
33 13
|
2天前
|
开发者 索引 Python
探索Python中的列表推导式
【9月更文挑战第33天】本文通过直观的示例和代码片段,深入浅出地介绍了Python中强大的功能——列表推导式。我们将从基础概念出发,逐步深入到高级应用,最后探讨其性能考量。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到有价值的信息。
13 8
|
5天前
|
Python
探索Python中的列表推导式
【9月更文挑战第30天】在编程的世界里,简洁和高效总是我们追求的目标。Python的列表推导式正是这样一把利器,它允许我们在一行代码中生成列表,既清晰又高效。本文将深入浅出地介绍列表推导式的基础知识、高级技巧以及如何避免常见的陷阱,让你的代码更加优雅。
|
5天前
|
索引 Python
python列表删除元素
python列表删除元素
14 1
|
9天前
|
Python
Python 选出列表中特定的元素
Python 选出列表中特定的元素
15 3
|
9天前
|
数据处理 索引 Python
Python列表与元素修改的操作技巧
Python列表提供了丰富的方法和技巧来进行高效的数据操作。熟练运用上述技巧,可以大大提高数据处理的效率和代码的可读性。实践中,根据具体需求灵活选择合适的方法,可以在保证代码效率的同时,也使代码更加简洁明了。
19 2
|
9天前
|
Python
python之列表生成式
python之列表生成式
|
9天前
|
Python
探索Python中的列表推导式
在本文中,我们将深入探讨Python中一个强大且灵活的特性——列表推导式。列表推导式是一种简洁而优雅的方法,用于创建和操作列表。它不仅使代码更易读,还能提高开发效率。通过几个示例,我们将展示列表推导式的多种应用,从基本的操作到复杂的组合,帮助读者更好地理解和利用这一工具。
10 1
|
9天前
|
Python
Python实现图片的拼接
Python实现图片的拼接
10 1
|
12天前
|
程序员 数据处理 开发者
探索Python中的列表推导式
【9月更文挑战第23天】在Python编程的海洋中,列表推导式如同一艘快速且灵活的小艇,让开发者能够以简洁的代码处理复杂的数据操作。本文将深入分析列表推导式的工作机制,展示其在不同场景下的强大功能,并探讨如何高效运用这一工具来提升代码的可读性和性能。
下一篇
无影云桌面