Skip to main content

[TOC]

字典

字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典用""标识。字典由索引(key)和它对应的值value组成。

dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"

tinydict = {'name': 'runoob','code':6734, 'dept': 'sales'}


print dict['one'] # 输出键为'one' 的值
print dict[2] # 输出键为 2 的值
print tinydict # 输出完整的字典
print tinydict.keys() # 输出所有键
print tinydict.values() # 输出所有值
---------结果--------------
This is one
This is two
{'dept': 'sales', 'code': 6734, 'name': 'runoob'}
['dept', 'code', 'name']
['sales', 6734, 'runoob']

修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对

tinydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

tinydict['Age'] = 8 # 更新
tinydict['School'] = "RUNOOB" # 添加


print "tinydict['Age']: ", tinydict['Age']
print "tinydict['School']: ", tinydict['School']
-----------结果-------------
tinydict['Age']: 8
tinydict['School']: RUNOOB

删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

tinydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

del(tinydict['Name']) # 删除键是'Name'的条目
tinydict.clear() # 清空字典所有条目
del(tinydict) # 删除字典

字典内置函数&方法

序号函数及描述
1len(dict) 计算字典元素个数,即键的总数。
2str(dict) 输出字典可打印的字符串表示。
3type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。
序号方法及描述
1dict.clear() 删除字典内所有元素
2dict.copy() 返回一个字典的浅复制
3[dict.fromkeys(seq, val]) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
4dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
5dict.has_key(key) 如果键在字典dict里返回true,否则返回false。Python3 不支持。
__ contains__(key)在python3中替代
6dict.items() 以列表返回可遍历的(键, 值) 元组数组[('', ), ('', )]
7dict.keys() 以列表返回一个字典所有的键
8dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9dict.update(dict2) 把字典dict2的键/值对更新到dict里
10dict.values() 以列表返回字典中的所有值
11[pop(key,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
del 语句和 pop() 函数作用相同,pop() 函数有返回值
12popitem() 返回并删除字典中的最后一对键和值。

注:

  • **直接赋值:**其实就是对象的引用(别名)。
  • **浅拷贝(copy):**拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

字典浅拷贝实例

>>>a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

深度拷贝需要引入 copy 模块:

>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

解析

1、b = a: 赋值引用,a 和 b 都指向同一个对象。

img

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

img

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

img