元组不是那么”不可变”
虽然元组对象本省不可变, 但这并不意味着元组包含的可变对象也不可变了.
t = (['xyz', 123], 23, -103.4)
\#t = (['xyz', 123], 23, -103.4)
t[0][1] = ['abc', 'def']
\#t = (['xyz', ['abc', 'def']], 23, -103.4)
默认集合类型
所有多对象的, 逗号分隔的, 没有明确用符号定义的, 比如说用方括号表示列表和用圆括号表示元组一样, 等等这些集合默认的类型都是元组.
'abc', -4.24e93, 18+6.6j, 'xyz'
\#('abc', -4.24e93, 18+6.6j, 'xyz')
所有函数返回的多对象(不包括有符号封装的)都是元组类型. 有符号封装的多对象集合其实就是返回的一个单一的容器对象.
def foo1():
return obj1, obj2, obj3 #返回包含三个对象的元组
def foo2():
return [obj1, obj2, obj3] #返回一个单一对象, 包含三个对象的列表
def foo3():
return (obj1, obj2, obj3) #返回三个对象的元组, 显式定义
为了避免讨厌的副作用, 最好是总是显式的用圆括号表达式表示元组或者创建一个元组.
4, 2 < 3, 5 #(4, True, 5)
(4, 2) < (3, 5) #tuple comparison
单元素元组
圆括号包裹一个单一元素时,首先被作为分组操作, 而不是元组的分界符. 可通过在第一个元素后面添加一个(,);来表明这是一个元组而不是在做分组操作
type(['abc']) #a list
type(('abc')) #a string, not a tuple
type(('abc', )) #a tuple