Python3中元组的不变性

时间:2018-06-20 14:04:48

标签: python python-3.x tuples

我们知道元组在Python中是不可变的。那么下面的代码为什么起作用?

3 * ('a','b','c')
  

给出如下输出:

('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')

3 个答案:

答案 0 :(得分:4)

您创建了一个新的元组,了解id的不同之处:

>>> a = (1,2,3)
>>> id(a)
4505615456
>>> b = a * 3
>>> id(b)
4504578232

但是,如果您做了同样的事情,那么您完成的工作也会创建一个新列表:

>>> a = [ 1, 2, 3 ]
>>> id(a)
4505618120
>>> b = a * 3
>>> id(b)
4505618248

您可以使用以下代码查看该列表的可变性:

>>> a = [ 1, 2, 3]
>>> id(a)
4505618568
>>> a.append(1)
>>> a.append(2)
>>> a.append(3)
>>> a
[1, 2, 3, 1, 2, 3]
>>> id(a)
4505618568

使用元组无法实现相同的目标。

让自己相信元组是不可变的最后一件事:

>>> a = (1, 2, 3)
>>> a[0]
1
>>> a[0] = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a
(1, 2, 3)

相对应的列表:

>>> a = [1, 2, 3]
>>> a[0]
1
>>> a[0] = 10
>>> a
[10, 2, 3]

有关更多信息和陷阱,请参阅这篇有趣的文章http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html

答案 1 :(得分:1)

“不可变”表示“无法修改”,而不是“不能用于构造其他数据”。不管怎么说,后者在容器中没有多大意义!除了包含供以后使用的数据之外,元组还有什么用?

您的示例代码3 * ('a', 'b', 'c') = ('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')仅显示将元组乘以标量会创建带有重复元素的新元组。但是,以下操作是不可能的:

tup = ('a', 'b', 'c')
tup[0] = 'z'  # fails, because tuples are not mutable

答案 2 :(得分:0)

`('a','b','c')` is a tuple.

3 * ('a','b','c')=('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')是另一个元组,它是('a','b','c')的3倍。 如果您认为x =('a','b','c'),则3*('a','b','c') = x + x + x`(看,x和x + x + x不一样!),它们都是独立的元组。 在这个类似的规则中,1和1 + 1 + 1是不一样的!

您会在Benjamin Toueg的答案中找到一个证明。