【问题标题】:Adding value to a list in a tuple [duplicate]向元组中的列表添加值[重复]
【发布时间】:2016-06-04 21:32:17
【问题描述】:

这里有 2 段 Python 代码:

t = (1, [2])
t[1] += [3]

t = (1, [2])
t[1].append(3)

第一部分首先修改了内部列表t[1],然后在尝试重新分配元组中的值时抛出异常。尽管t 的值实际上已经改变,但这种行为或多或少是可以理解的。但是第二段代码更改了元组而没有任何错误/异常/无论如何(据我所知,因为它更改了列表t[1] 而没有重新分配)。 问题是,这些东西不与元组的不变性相矛盾吗?

【问题讨论】:

    标签: python list python-2.7 python-3.x tuples


    【解决方案1】:

    元组是不可变的,这意味着您无法更新或更改 元组元素的值。您可以获取现有的部分 tuples 来创建新的元组,如下例所示 -

    #!/usr/bin/python
    
    tup1 = (12, 34.56);
    tup2 = ('abc', 'xyz');
    
    # Following action is not valid for tuples
    # tup1[0] = 100;
    
    # So let's create a new tuple as follows
    tup3 = tup1 + tup2;
    print tup3
    

    当上面的代码被执行时,它会产生以下结果 -

    (12, 34.56, 'abc', 'xyz')

    但是当您访问像 t[1] 这样的元组中的列表时,您访问的是允许您使用类函数的对象引用。不可变的是元组,而不是包含的对象。

    【讨论】:

      【解决方案2】:

      我认为您唯一缺少的是“元组是不可变的”仅意味着您不能更改元组元素的引用。如果一个元素是可变的,你仍然可以改变它。

      【讨论】:

        【解决方案3】:

        这里的主要规则是:“元组本身是不可变的。它的内容,不是。

        当您调用 append 方法时,您正在修改元组的一个元素,而不是元组本身。所以,调用是有效的。您可以在该示例中看到它:

        tab = (new Object(), new Object(), new Object())
        tab[1].changeContent(); 
        

        现在,只需将 changeContent 替换为 append 方法,您就会明白为什么它是有效的。值tab[1] 仍然引用同一个对象。但是对象本身发生了变化。

        但是,当您使用“加号”运算符时,情况就不一样了。

        当你打电话时

        tab[0] += [1]
        

        它被重写为类似的东西(如果你认为“addWith”是返回加法结果的函数):

        tab[0] = tab[0].addWith([1])
        

        您可以看到它正在修改元组本身(它将第一个单元格链接到另一个对象),这就是调用无效的原因。

        【讨论】:

        • 但是doesn't this stuff contradict the immutability of tuples?
        • 我编辑了我的帖子:“元组是不可变的,而不是它们的内容”;)
        猜你喜欢
        • 2015-10-02
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 2022-08-11
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        相关资源
        最近更新 更多