*********************************************************** 如果没明确定义,默认集合类型是元组。最好显示的创建元组。 *********************************************************** 字典:不可变对象的值是不可改变的,意味着他们通过hash算法得到的总是一个值。这是作为字典键值的一个必要条件。 工厂模式:工厂类内部包含了必要的逻辑判断,客户端只要提供选择条件即可,这样客户端就不需要知道具体产品的信息了。 浅拷贝和深拷贝 浅拷贝:字符串被显式的拷贝,并新创建了一个字符串对象,列表元素只是把它的引用复制了一下,并不是它的成员。 浅拷贝的对象本身是新的,但它的内容不是。序列类型对象的钱靠背是默认类型拷贝,有以下实施方式:完全切片操作、利用工厂函数(list、dict等)、使用copy模块的copy函数。>>> person = ['name',['savings',100.00]] >>> hubby = person[:] >>> wifey = list(person) >>> [id(x) for x in person,hubby,wifey] [42230368, 42221736, 42221856] >>> hubby[0] = 'joe' >>> wifey[0] = 'Jane' >>> hubby,wifey (['joe', ['savings', 100.0]], ['Jane', ['savings', 100.0]]) >>> hubby[1][1] = 30.00 >>> hubby,wifey (['joe', ['savings', 30.0]], ['Jane', ['savings', 30.0]])
深拷贝:创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用>>> person = ['name',['savings',100.00]] >>> hubby = person >>> import copy >>> wifey = copy.deepcopy(person) >>> [id(x) for x in person,hubby,wifey] [42225376, 42225376, 42230328] >>> hubby[0] = 'joe' >>> wifey[0] = 'Jane' >>> hubby,wifey (['joe', ['savings', 100.0]], ['name', ['savings', 100.0]]) >>> hubby[1][1] = 30.00 >>> hubby,wifey (['joe', ['savings', 30.0]], ['name', ['savings', 100.0]]) >>>
*********************************************************************
非容器类型(数字、字符、字符串等)没有被拷贝一说,浅拷贝是用完全切片操作完成的。
(python的容器主要包含列表列表,字典)
如果元组变量只包含原子类型对象(代码、类型、xrange等),对他的深拷贝将不会进行。如果把账户信息改成元组类型,那也只能得到一个浅拷贝。(元组无法进行深拷贝)
********************************************************************
用工厂方法创建字典>>> fdict = dict((['x',1],['y',2])) >>> fdict {'y': 2, 'x': 1}
用内建方法创建“默认字典”,字典中元素具有相同的值(若没给出,默认为None)>>> fdict = dict((['x',1],['y',2])) >>> fdict {'y': 2, 'x': 1} >>>
通过迭代器访问类序列对象>>> for key in dict2: print 'key=%s,value=%s' %(key,dict2[key]) key=name,value=earth key=port,value=80
字典中混用数字和字符串>>> dict3 = {} >>> dict3[1] = 'abc' >>> dict3['1'] = 3.14159 >>> dict3[3.2] = 'xyz' >>> dict3 {'1': 3.14159, 1: 'abc', 3.2: 'xyz'} >>>
更新字典
添加一个数据项或新元素、修改一个已存在的数据项、删除一个已存在的数据项>>> >>> dict2 = {'name':'earth','port':80} >>> dict2['name'] = 'venus' #更新已有条目 >>> dict2['arch'] = 'sunos5' #增加新条目 >>> print 'host %(name)s is running on port %(port)d' %dict2 host venus is running on port 80 >>> del dict2['name'] #删除键为“name”的条目 >>> dict2.clear() #删除字典中所有条目 >>> del dict2 #删除整个字典
****************************
注意字典元素打印的方法
****************************
字典的比较算法
首先是字典大小,然后是键,最后是值。
映射类型相关函数
工厂函数被用来创建字典。如果不提供参数,会生成空字典。>>> dict(zip(('x','y'),(1,2))) {'y': 2, 'x': 1} >>> dict([['x',1],['y',2]]) {'y': 2, 'x': 1} >>> dict([('xy'[i-1],i) for i in range(1,3)]) {'y': 2, 'x': 1} >>> dict(x=1,y=2) {'y': 2, 'x': 1} >>> dict8 = dict(x=1,y=2) >>> dict8 {'y': 2, 'x': 1} >>> dict9 = dict(**dict8) #效率低,不采用,宜用copy >>> dict9 {'y': 2, 'x': 1} >>> dict9 = dict8.copy() >>> dict9 {'y': 2, 'x': 1} >>>
映射类型内建方法-返回字典的值>>> dict2 = {'name':'earth','port':80} >>> dict2.keys() ['name', 'port'] >>> dict2.values() ['earth', 80] >>> dict2.items() [('name', 'earth'), ('port', 80)]
字典提供的方法
dict.clear():删除字典中所有元素
dict clear():返回字典(浅复制)的一个副本
dict.fromkeys(seq,val = None):创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None)。>>> {}.fromkeys('xyz') {'y': None, 'x': None, 'z': None} >>> {}.fromkeys(('love','honor'),True) {'love': True, 'honor': True} dict.get(key,default=None):对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,返回default的值(默认为None) dict.items(key):返回包含字典中键、值对元组的列表 dict.keys():返回一个包含字典中键的列表 dict2.values():返回一个包含字典中所有值的列表 dict.pop(key[,default]):若存在key键,删除并返回其值,若不存在,且没有给出default值,则引发KeyError异常 dict.setdefault(key,default=None):查找键为key的值,若存在,返回其值,若不存在,赋值default >>> mudict = {'host':'earth','port':80} >>> mudict.keys() ['host', 'port'] >>> mudict.setdefault('port',8080) 80 dict.update(dict2):将字典dict2的键值对添加到字典dict
字典的键必须可哈希
作为键的Python对象必须是可哈希的对象,列表和字典这种可变类型不能作为键。
值相等的数字键值是相同的,整型1和浮点数1.0的哈希值相同,为相同的键。
Python--映像和集合类型(字典)
最新推荐文章于 2024-08-11 18:27:42 发布