python学习笔记:元组,乘拷贝,高级拆包

元组

元组是一种固定长度、不可变的python对象序列。
创建元组最简单的办法就是用逗号分隔序列值

a = 1, 2, 3, 5
print(a)             # (1, 2, 3, 5)

元组一旦创建,各个位置上的对象是无法被修改的
但是,如果元组中的一个对象是可变的,则可以修改这个可变变量

tup = tuple(['foo', [1, 2], True])    # 显式转换类型
#tup[2] = False   # 报错:TypeError: 'tuple' object does not support item assignment
tup[1].append(3)  #[1, 2]是可变对象
print(tup)        # ('foo', [1, 2, 3], True)

.

乘拷贝

乘拷贝其实是我自己创造出来的词,用来表示以下情况:

a = [0]*3
print(a)         # [0, 0, 0]
print(id(a[0]))  # 140736869736816
print(id(a[1]))  # 140736869736816
print(id(a[2]))  # 140736869736816

看到前两行,你可能会觉得奇怪。不就是一个普通的生成列表嘛,有什么好讨论的?
但请你仔细看后三行,发现了什么?列表a中三个元素的对象地址一模一样。
也就是说,对象[0]并没有进行复制,只是指向他的引用进行了复制,a中的三个元素其实只是一个对象[0]的三个引用

可能你还没有感到什么奇怪的地方,那么再举一个例子:

a = [[0]]*3
a[1].append(3)
print(a)       # [[0, 3], [0, 3], [0, 3]]

奇怪的事情发生了!(呆猫
我明明修改的是a[1],为什么整个a都被修改了?
正如上文所说,这就是乘拷贝带来的恶果。这种情况下,a[1],a[2],a[3]只是一个对象的三个不同引用而已。因此,修改了一个,另外两个也会变化

.

高级拆包

高级拆包用于在函数调用时获取任意长度的位置参数列表
举个栗子

values = 1, 2, 3, 4, 5
a, b, *_ = values
print(a, b)       # 1 2
print(_)          # [3, 4, 5]

该功能使用了特殊的语法*_(其中_就是一个变量名,你可以取任何你想要的名字),值得注意的是,无论原对象是元组,列表,还是字符串等,_返回的都是一个列表

.

参考资料

《利用python进行数据分析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值