'''元组
    Python内置的数据类型之一,是一个不可变序列
    不可变序列:字符串 元组
                没有增,删,改操作
    可变序列:   列表,字典
                可以对序列执行增,删,改操作,对象地址不发生更改'''

'''元组的创建方式
    直接小括号   t=('python','hello',98)
    使用内置函数tuple()   t=tuple(('python','hello',98))
    只包含一个元组的元素需要使用逗号和小括号    t=(10,)'''

t='python','hello',98   #省略了小括号
print(t)
print(type(t))
t=tuple(('python','hello',98))
print(t)
t=(10,)     #如果元组中只有一个元素,逗号不可省略
print(t)
#创建空元组
t=()
print(t)

'''为什么要将元组设计成不可变序列
    在多任务环境下,同时操作对象时不需要加锁
    因此,在程序中尽量使用不可变序列
    注意事项:元组中存储的是对象的引用
    如果元组中对象本身是不可变对象,则不能在引用其他对象
    如果元组中的对象是可变对象,则可变对象的引用不允许改变,但数据允许改变'''

t=(10,[20,30],9)
print(t)
print(type(t))
print(t[0],type(t[0]),id(t[0]))
print(t[1],type(t[1]),id(t[1]))
print(t[2],type(t[2]),id(t[2]))
'''尝试将t[1]修改为100'''
#t[1]=100   元组是不允许修改元素的
'''由于[20,30]列表,而列表是可变序列,所以可以向列表中添加元素,列表的内存地址不变'''
t[1].append(100)    #向列表中添加元素
print(t,id(t[1]))

#元组的遍历
#元组是可迭代对象,可以使用for...in...来遍历
t=('python','hello',98)
#获取元组元素的方式,使用索引
print(t[0])
print(t[1])
print(t[2])
#print(t[3])    #IndexError:tuple index out of range
#遍历元组
for item in t:
    print(item)