共计 1255 个字符,预计需要花费 4 分钟才能阅读完成。
来到的容器类型的阅读,今天分享5个点:
- NameTuple
- 字典中的setdefault方法
- frozenset
- 值传递vs引用传递
- 深浅拷贝
除了2,3其他都是了解的,2
还是按顺序一个一个来说下吧!
namedtuple
中文名字命名元组,意思就是可以通过指定的变量名去访问元组里面的数据,本质上还是元组。平时用的比较少,先看下初始化方式:
from collections import namedtuple
info=namedtuple('info','name,website')
test=info('xiaocui','www.deeplearn.me')
test.name
对比于元组的索引访问,这个就是可以使用定义好的参数名去访问,因为涉及参数命名,相对来说更好理解。
但是想要实现这样的效果,自定义类也是可以的,主要看使用的方便性,如果是博主的话,估计会考虑类实现吧,有点无脑。。。
字典中的setdefault方法
对于的key 赋值一般写代码都是直接对key进行赋值,除非有些特殊的格式要求。比如value是list,如果不使用这个fuction你要走以下几步:
- 判断key在不在,不在设置默认值[],然后往里写数据
- 在的话继续向value里插入数据
其实在使用的时候会考虑defaultdict类
from collections import defaultdict
这个类允许你在初始化的时候指定value的格式类型。但是你的value格式多种,那么还是使用setdefault吧!
frozenset
冻结的集合,说白了就是不可更改,被冻住了。除非你要设置一些固定常量的数据,不可以被更改的时候需要通过此方式来声明定义。
值传递vs引用传递
在python里这么说其实都不太合适,以前写c++的时候这个区分度很大,比如你使用取地址符可能要表示引用。在python里都会新建一个变量指向相同的数据,但是在使用的时候是否会修改这个值由这个指向的数据本身的可变与不可变性决定。
举个例子:如果是个list 的参数,可变,如果a,b同时指向,其中一个改变数据,另外一个也是会改变的。但是str就不会了。
这个时候也可以”假想是值传递和引用传递”
深浅拷贝
拷贝的目的就是不想在原来的值上直接修改,拷贝的函数都是来自copy这个包。
from copy impot copy,deepcopy
copy是浅拷贝
deepcopy是深拷贝
一般情况下,浅拷贝即可,比如一个简单的list,直接使用copy即可,但是如果你是一个嵌套的数据类型,则必须要使用深拷贝。
>>> test=[1,[1,2]]
>>> from copy import deepcopy
>>> test1=deepcopy(test)
>>> test1[1]=[2,3]
>>> test
[1, [1, 2]]
如果使用copy的话
>>> test=[1,[1,2]]
>>> from copy import copy
>>> test1=copy(test)
>>> test1[1].append(3)
>>> test
[1, [1, 2, 3]]
>>>