Python元组你了解多少?--元组不可修改or元组可修改?

Kirima ·
更新时间:2024-09-20
· 709 次阅读

本文没有太多学习性的东西!!! 更多的是扩展你对Python的认知.

这篇帖子主要讲讲几个月前看的一本书,《流畅的Python》真本书是由一位奋战在Python开发一线的大牛写的,书中有讲了多关于Python的神奇特性,对你写一段地道的Pythonic非常有帮助. 元组不可修改or可修改

结合曾经的学习经验,你一定会认为Python的元组是不可修改的序列.就像下面的代码,你应该已经知道了结果.
(代码均使用交互式环境执行)

>>> t = (1,2,3,4) >>> t.append(5) # >>> AttributeError: 'tuple' object has no attribute 'append' >>> t += (5) # >>> TypeError: can only concatenate tuple (not "int") to tuple

从报错上来看,元组是没有append()方法的 (这与魔术方法有关,如果你了解魔术方法那你也许就能够明白为什么元组不可修改),所以使用append()方法对元组进行修改的思想就先放放吧,但是观察一下使用 += 对元组进行修改时的报错却是一个 TypeError ,所以由此衍生出了一个想法 “能否改变对象 (对象包括修改的元组和添加的对象) 的类型使得可以使用+=的将元组进行修改”.

>>> t = (1,2,3) >>> t+=(()) # >>> >>> t # >>> (1,2,3)

从上面的代码中可以看到改变类型确实可以完成元组的修改,虽然是没有意义的,但是重要的是没有报错!!!

再次改变想法,如果改变的是元组的类型会怎么样,可能到这你不太能够理解我的意思,但是并没有什么大碍,阅读下面的代码你一定能够快速理解.

>>> t = (1,2,3,[4,5]) >>> t[3].append(6)

如果是这样的一段代码结果会怎么样呢?

>>> t # >>> (1,2,3,[4,5,6])

答案是元组的列表成功的被append()方法修改了 (还是和魔术方法有关系,因为列表中有关于append()方法的魔术方法,所以使列表变得可以修改了) ,再回到修改方式,如果使用 **+=**会怎么样? 是否和append()方法的结果一样呢?

>>> t = (1,2,3,[4,5]) >>> t[3] += [6] # 保证类型一致 # >>> t[3] += ([6]) # 两段代码结果一样,看自己可以理解的就行 # !!! 错误示范: # >>> t[3] += (6) # 不同的数据类型不可以进行运算!!! # Output: # >>> TypeError: 'tuple' object does not support item assignment

从上面的代码中可以看到,最后的结果是一段报错,但是结合之前的append()方法,按理来说元组内的列表应该能够被正常修改,但是为什么结果却是一个报错呢? (元组发现了+=是用来修改的所以产生了报错)

接下来的代码是在上一段代码的基础之上进行输出的(这也是选择交互式环境的理由)

>>> t # >>> (1,2,3,[4,5,6])

虽然在进行修改是产生了报错,但是最后的输出结果却是修改成功的!!! 由上面的代码可以知道,元组内的可修改序列是可以被修改的!!!这是一个重点,所以在使用元组的时候经历千万不要把可修改序列放在其中!!!

总结: 不要把可修改序列放在元组中!!! 增量赋值不是一个原子操作(所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义)

Python运行原理可视化(Python Tutor): http://www.pythontutor.com

Luw.LLL 原创文章 4获赞 5访问量 242 关注 私信 展开阅读全文
作者:Luw.LLL



Python OR

需要 登录 后方可回复, 如果你还没有账号请 注册新账号