我们知道元组在Python中是不可变的。那么下面的代码为什么起作用?
3 * ('a','b','c')
给出如下输出:
('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')
答案 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的答案中找到一个证明。