将值添加到元组中的列表

时间:2016-06-04 21:32:18

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

这里有两段Python代码:

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

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

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

3 个答案:

答案 0 :(得分:0)

  

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

#!/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]那样访问元组中的列表时,你可以访问允许你使用类函数的对象引用。不可变的是元组,而不是包含的对象。

答案 1 :(得分:0)

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

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

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

现在,只需使用changeContent方法替换append,您就会明白为什么它有效。值tab[1]仍引用同一对象。但是对象本身已经改变了。

但是,当你使用" plus"运营商,情况并非如此。

致电时

tab[0] += [1]

它被重写为(如果你认为" addWith"是返回添加结果的函数):

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

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

答案 2 :(得分:0)

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