***********************************************************
如果没明确定义,默认集合类型是元组。最好显示的创建元组。
***********************************************************
字典:不可变对象的值是不可改变的,意味着他们通过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的哈希值相同,为相同的键。