这里有两段Python代码:
t = (1, [2])
t[1] += [3]
和
t = (1, [2])
t[1].append(3)
第一部分首先修改内部列表t[1]
,然后在尝试重新分配元组中的值时抛出异常。虽然t
的值实际上已经改变,但这种行为或多或少是可以理解的。但是第二段代码更改了元组而没有任何错误/异常/无论什么(据我所知,因为它更改了列表t[1]
而没有重新分配)。
问题是,这些东西是否与元组的不变性相矛盾?
答案 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)
我认为你唯一缺少的是“元组是不可变的”只意味着你不能改变元组元素的引用。如果一个元素是可变的,你仍然可以改变它。