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

为什么Python元组中列表的+ =会引发TypeError但无论如何都会修改列表?

景鹏飞
2023-03-14
问题内容

我刚遇到一个很奇怪的东西。

    >>> t = ([],)
    >>> t[0].append('hello')
    >>> t
    (['hello'],)
    >>> t[0] += ['world']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> t
    (['hello', 'world'],)

为什么它会抬高TypeError而又改变list内部tuple


问题答案:

正如我在评论中开始提到的那样,+=实际上是 在原地
修改列表,然后尝试将结果分配给元组中的第一个位置。从数据模型文档中:

调用这些方法以实现增强的算术分配(+ =,-=, =,/ =,// =,%=,* =,<< =,>> =,&=,^ =,|
=)。这些方法应尝试就地进行操作(修改self)并返回结果(可以是,但不一定是self)。

+= 因此等于:

t[0].extend(['world']);
t[0] = t[0];

因此,就地修改列表不是问题(1.步骤),因为列表是可变的,但是将结果分配回元组是无效的(2.步骤),这就是抛出错误的地方。



 类似资料:
  • 我想把一个数组的不同数组元素组合(排列)放到一个列表中。我通过for循环交换数组的第一个和最后一个元素,组合(排列)被添加到列表中。然后,第二个元素和最后一个元素之前的元素被交换并添加到列表中,依此类推。假设数组是,添加到列表中的第一个元素将是。第二个元素是。但我最终得到的是列表中所有元素的。 问题是添加到List中的元素也会随着数组的当前修改而相应地修改。我最终在List中得到了类似的数组元素。

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 问题内容: 我刚刚读过“深入Python”,“元组比列表快”。 元组是不可变的,列表是可变的,但是我不太明白为什么元组更快。 有人对此进行过性能测试吗? 问题答案: 所报告的“构建速度”比率仅适用于 常量 元组(其项目由文字表示的元组)。仔细观察(并在您的机器上重复-您只需要在shell /命令窗口中键入命令即可!)…: 我没有在3.0上进行测量,因为我当然没有它-它已经完全过时了,绝对没有理由保

  • 问题内容: 我正在尝试配置Ehcache(2.5版),使其永远不会忘记项目。我正在以编程方式进行配置,但没有涉及任何配置XML文件。通过设置,我的理解是,只有在我磁盘空间不足或超过(或应用程序终止)的情况下,才可以从缓存中删除项目。但是,此测试程序未显示该行为: 因此,在将100万个元素添加到缓存后(我告诉它会溢出到足够大的数量级的磁盘上)之后,最后我只剩下3276个项目。这是怎么回事 问题答案:

  • 问题内容: 我知道在Java中通过引用传递它们时,它们是可变的。 我想确切知道它的原始列表和子列表的内存地址中发生了什么。 子列表和原始列表是否引用相同的对象? 以下是反映从子列表到主原始列表所做更改的代码示例。 问题答案: 根据此事: 列表subList(int fromIndex,int toIndex) 返回此列表中指定的fromIndex(包括)和toIndex(不包括)之间的视图。(如果

  • 问题内容: 输出: 但是当我执行以下操作时: 输出: 为什么扩展列表引用而不是列表扩展? 我发现这是因为我在尝试将listC扩展到listB时试图将listB附加到listA。 假设列表不能直接附加/扩展。解决该问题最常用的表格形式是什么? 问题答案: 修改到位列表,不返回任何内容,从而导致。在第二种情况下,这是一个正在扩展的临时列表,该列表在该行后立即消失,而在第一种情况下,可以通过引用。 在尝