Python3中元组的不变性

Python3中元组的不变性,python,python-3.x,tuples,Python,Python 3.x,Tuples,我们知道元组在Python中是不可变的。那么为什么下面的代码可以工作呢 3 * ('a','b','c') 给出如下输出: 您创建了一个新元组,请参见ids的区别: >>> a = (1,2,3) >>> id(a) 4505615456 >>> b = a * 3 >>> id(b) 4504578232 但是,如果您执行了同等操作,您所完成的工作也将创建一个新列表: >>> a = [ 1, 2,

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

3 * ('a','b','c')
给出如下输出:


您创建了一个新元组,请参见
id
s的区别:

>>> 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)
有关更多信息和陷阱,请参阅这篇有趣的文章。

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

您的示例代码
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
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是不一样的


你会在本杰明·图格的回答中找到证据

它创建了一个新的元组,使现有元组保持不变,
3*[1,2]
还创建了一个新的列表(这就是自定义类也是如何实现的,不管其易变性如何),你在做什么?数字也是不可变的,但是你可以
x=5
然后
x*3
得到15。元组是一样的。顺便说一句,一个稍微有趣的问题是为什么
tup*=3
起作用,当然这也是有意的,并有文档记录的
>>> a = [1, 2, 3]
>>> a[0]
1
>>> a[0] = 10
>>> a
[10, 2, 3]
tup = ('a', 'b', 'c')
tup[0] = 'z'  # fails, because tuples are not mutable
`('a','b','c')` is a tuple.