当前位置: 首页 > 面试题库 >

Python-元组为什么可以包含可变项?

岳杜吟
2023-03-14
问题内容

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

似乎矛盾的是,当可变项(例如列表)确实被修改时,它所属的元组保持不变。


问题答案:

这是一个很好的问题。

关键的见解是,元组无法知道其中的对象是否可变。使对象可变的唯一方法是拥有一种更改其数据的方法。通常,无法检测到此情况。

另一个见解是Python的容器实际上不包含任何东西。相反,它们保留对其他对象的引用。同样,Python的变量与编译语言中的变量不同。相反,变量名只是名称空间字典中的键,它们与对应的对象相关联。Ned Batchhelder在他的博客文章中很好地解释了这一点。无论哪种方式,对象仅知道其引用计数。他们不知道这些引用是什么(变量,容器或Python内部函数)。

这两种见解共同解释了你的奥秘(为什么当基础列表更改时,包含列表的不可变元组似乎也会更改)。实际上,元组没有变化(它对其他对象的引用与以前相同)。元组无法更改(因为它没有变异方法)。当列表更改时,没有通知元组更改(列表不知道它是由变量,元组还是其他列表引用)。

当我们讨论该主题时,还有一些其他想法可以帮助你完善关于元组是什么,它们如何工作以及其预期用途的思维模型:

元组的特征较少在于其不变性,而其特征在于其预期目的。
元组是Python在一个屋顶下收集异构信息的一种方式。例如, s = ('www.python.org', 80) 将字符串和数字组合在一起,以便主机/端口对可以作为套接字(复合对象)传递。从这个角度来看,具有可变的组件是完全合理的。

不变性与另一个特性,即哈希性密切相关。但是哈希性不是绝对的属性。如果元组的组成部分之一不可哈希,则整个元组也不可哈希。例如,t = ('red', [10, 20, 30])不可散列。

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

记住两件事。首先,不变性不是魔术,而是缺少突变方法。其次,对象不知道哪些变量或容器引用了它们-它们仅知道引用计数。



 类似资料:
  • 问题内容: 这是我的代码: 问题答案: 像所有的专用方法(用“魔法姓名”开始和结束),是 不是 意味着要直接调用(除非是非常特殊的情况下,诸如最多=调用父类):确切地说,这种方法被称为的一部分内置程序和运算符的操作。在的情况下,所讨论的运算符是“包含检查”运算符。 在展示您的班级时(除了修正您的错字,并使用!!代替),并将其作为实例打印-以及对其他任何包含检查的打印,因为总会返回(因为,非空值字符

  • 为什么Java中的Switch语句可以包含一个FINAL变量作为CASE?## 在我检查过的JDK7中,值不能重新分配给最终变量,如下所示。但是,为什么即使不能重新分配最终变量“x”的值,最终变量“x”也可以包含在Switch语句中? 为什么即使Oracle定义Java编译器将最终变量作为初始化的值而不是变量名,也可以这样做?http://docs.oracle.com/javase/specs/

  • 问题内容: 在课堂上,我在玩耍,发现CSS可以与虚构元素一起使用。 例: 当我的教授第一次看到我使用此功能时,他对组合元素起作用感到惊讶,并建议我将所有组合元素更改为带有ID的段落。 为什么我的教授不希望我使用虚构元素?他们有效地工作。 另外,他为什么不知道组成元素存在并且可以与CSS一起使用。他们不常见吗? 问题答案: 为什么CSS可以处理假元素? (大多数)浏览器被设计为(在某种程度上)与将来

  • 在我的课堂上,我四处游荡,发现CSS可以使用虚构的元素。 示例: null null 当我的教授第一次看到我使用这个的时候,他有点惊讶于合成元素的工作,并建议我简单地将所有合成元素改为带有ID的段落。 为什么我的教授不希望我使用虚构的元素?它们有效地工作。 还有,为什么他不知道虚构元素的存在,并与CSS一起工作。他们不常见吗?

  • 问题内容: 我已经阅读了《使用效果的完全指南-过度反应应对潮流》。 该示例表明,如果我们想获取最新的,我们可以使用保存可变变量,并在异步函数laster中获取它: 但是,我可以通过在组件函数外部创建一个变量来执行相同的操作,例如: 两种方法都可行,或者如果我在函数组件外部定义变量,有什么不好的方法吗? 问题答案: 将为 每个 组件分配一个引用,而在函数组件外部定义的变量将仅被调用一次。 此外,尝试

  • 问题内容: 标签中可以包含哪些有效的html元素(如果有)? 问题答案: 内联元素(除其他外)可以包含其他内联元素和文本节点。锚点可以包含一个范围,该范围可以包含一个文本节点。 通常,块级元素可以包含内联元素和其他块级元素。通常,内联元素可以仅包含数据和其他内联元素。这种结构上的区别固有的思想是,块元素比内联元素创建“更大”的结构。 在其他的答案指出,你不能嵌套的在。