面试python遇到的一道数据类型基础题
我们都知道python中不可变类型有tuple,但是如果tuple里面的列表增加元素会怎么样呢?
先看代码:
a = (1,2,3,[4,5])
print(a[3]) # [4, 5]
a[3].append(6)
print(a) # (1, 2, 3, [4, 5, 6])
a[3] += [9]
"""Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
"""
print(a) # (1, 2, 3, [4, 5, 6, 9])
a[3] = a[3] + [10]
"""Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
"""
print(a) # (1, 2, 3, [4, 5, 6, 9])
我们发现:
(1)当元祖a里面有列表[4,5],我们进行a[3].append(6)操作时,成功添加"6"没任何问题.
(2)当我们使用 += 的时候a[3] += [9],就报错了,但是最后还是成功添加进去了
(3)然后我们使用 a[3] = a[3] + [10]的时候,发现也报错但是并没有加进去
其实报错的原因是因为赋值=的时候,我们不能修改元祖的元素地址(这也是元祖不可变的原因),
我们可以修改元祖的可变元素(比如列表)的值,但是不能修改地址,所以不能用赋值符号
而修改值的操作比如extend(),append(),remove()是在原有内存区间修改值,以及比较特殊的+=是先进行值的修改再赋值,所以在原有的基础上增加成功,但是赋值操作失败报错了,也就是为啥还能修改成功的原因
网友评论