前言
这一段时间在研究nnUNet里面的代码,发现里面的语法用的太高级了,由衷的佩服作者,有些没见过,记录一下(函数式就不记录了,这个有点多)
用法列表
- *和**的用法(并不是相乘和平方… …)
1. 一个星号*,可以解开list的"[]" 或者tuple的"()":
x = [2, 3]
y = [1, *x, 4]
# 等价于
y = [1, 2, 3, 4]
2. 两个星号**,用来解开dict的花括号 "{}":
tmp = {'b': 2, 'c': 3}
y = {'a': 1, **tmp, 'd':4}
# 等价于
y = {'a': 1, 'b': 2, 'c': 3, 'd':4}
3. 假如是在函数调用的时对key值的string类型的dict进行解包,会变成 k=v的形式:
tmp = {'b': 2, 'c': 3}
func(a=1, **tmp)
# 等价于
func(a=1, b=2, c=3)
4. 直接把dict类型转换成list类型,会仅仅保留key值:
tmp = {'a':1, 'b': 2, 'c': 3}
assert list(tmp) == ['a', 'b', 'c']
2. deepcopy的使用
发现可变对象嵌套中的可变对象时,复制后共用了一个内存地址,有时copy并不满足我们的需求,我们需要完全复制对象,没有共享内存地址(针对 列表 字典 元组),这是需要实现一个新的方法,deepcopy 深拷贝。
我理解的copy就是由于list和tuple还有dict都是引用类型,所以在copy的时候无论是用‘=’还是用copy函数都仅仅是多一层指针而已,但是他的内存地址并没有改变(python并不存在指针,这样说只是好理解),而deepcopy则是可以不仅能够copy他的内容,他就相当于把这块内存又分配了一块,所以就可以避免改一个引用,其他地方相同引用也会受影响了,唯一的缺点可能就是有点占内存
退出登录?