如果一个元组是不可变的,那么为什么它可以包含可变的项呢?

当列表等可变项确实被修改时,它所属的元组保持不变,这似乎是一个矛盾.

推荐答案

这是一个很好的问题.

关键是元组无法知道其中的对象是否是可变的.唯一能让一个对象可变的就是有一个改变其数据的方法.一般来说,没有办法检测到这一点.

另一个见解是Python的容器实际上并不包含任何内容.相反,它们保留对其他对象的引用.同样,Python的变量与编译语言中的变量不同;相反,变量名只是名称空间字典中的键,它们与相应的对象相关联.Ned Batchelder在他的blog post篇文章中很好地解释了这一点.不管怎样,对象只知道它们的引用计数;他们不知道这些引用是什么(变量、容器或Python内部).

这两个洞见一起解释了你的谜团(为什么一个"包含"列表的不可变元组在基础列表发生变化时似乎会发生变化).事实上,元组没有改变(它对其他对象的引用仍然与以前相同).元组无法更改(因为它没有变异方法).当列表更改时,元组没有收到更改通知(列表不知道它是由变量、元组还是其他列表引用).

在我们讨论这个话题时,这里有一些其他 idea 可以帮助你完成元组是什么、它们如何工作以及它们的预期用途的心智模型:

  1. 元组的特点与其说是不变性,不如说是其预期用途

  2. 不变性与另一个属性hashability密切相关.但哈希性并不是绝对属性.如果元组的一个组件不可散列,那么整个元组也不可散列.例如,t = ('red', [10, 20, 30])是不可散列的.

最后一个示例显示了一个包含字符串和列表的2元组.元组本身是不可变的(也就是说,它没有任何改变其内容的方法).同样,字符串是不可变的,因为字符串没有任何变异方法.列表对象确实有变异方法,因此可以对其进行更改.这表明可变性是一种对象类型的属性——有些对象有变异方法,有些没有.这不会因为对象是嵌套的而改变.

记住两件事.首先,不变性不是魔术--它只是缺少变异的方法.其次,对象不知道引用它们的变量或容器--它们只知道引用计数.

希望,这对你有用:-)

Python相关问答推荐

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

OdooElectron 商务产品详情页面中add_qty参数动态更新

在Python中添加期货之间的延迟

如何才能将每个组比上一组增加N %?

Altair -箱形图边界设置为黑色,中线设置为红色

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

如何使用stride_tricks.as_strided逆转NumPy数组

如何处理嵌套的SON?

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

Odoo 16使用NTFS使字段只读

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

计算分布的标准差

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

Matplotlib中的字体权重

在pandas/python中计数嵌套类别

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

具有相同图例 colored颜色 和标签的堆叠子图

交替字符串位置的正则表达式