字典中的方法

  clear()方法:清空字典中的所有元素。这个方法是将字典清空,得到一个空字典,这个字典对象依然在内存中,此时,它是一个空字典而不是垃圾,不会被作为垃圾处理。

>>> stu
{'B': 123, 'C': 123, 'A': 123}
>>> stu.clear()
>>> stu
{}

  clear方法与del和dict = {}的区别:

    clear方法是将字典清空,得到一个空字典,这个字典对象依然在内存中,此时,它是一个空字典而不是垃圾,不会被作为垃圾处  理。

    del是直接将字典删除,删除后内存中就没有这个对象了。

>>> stu = {'Lily': 'python5', 'Jack': 'python5'}
>>> del stu    # del后内存中没有stu对象
>>> stu
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'stu' is not defined

  dict = {}是将变量重新指向了一个新的空字典对象,此时的原字典对象并没有被删除或清空,它依然存在于内存之中,但是成为了垃圾,等待着被python自动回收。

>>> stu = {'Lily': 'python5', 'Jack': 'python5'}
>>> stu
{'Lily': 'python5', 'Jack': 'python5'}
>>> stu = {}    # 变量stu重新指向了一个新的空字典对象,原字典对象成为垃圾
>>> stu
{}

  


get()方法:返回字典中某个键对应的值。

                  当指定的键存在于字典中时,返回该键对应的值。

>>> stu = {'Lily': 'python5', 'Jack': 'python5'}
>>> stu.get('Lily')
'python5'

  当指定的键不存在于字典中时,默认返回None,而不报错,这是和通过dict[key]取值的区别。

>>> stu = {'Lily': 'python5', 'Jack': 'python5'}
>>> stu.get('Tom')    # 没有此键,返回空值
>>> stu['Tom']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Tom'

  get()方法可指定第二个可选参数,此参数默认值为None,当指定的键不存在于字典中时,若无第二个参数,则返回None,若有第二个参数,则返回get方法的第二个参数给定的值。

>>> stu
{'Lily': 'python5', 'Jack': 'python5'}
>>> stu.get('Tom', 'java6')    # 没有此键,返回其第二个参数给定的值
'java6'

  setdefault()方法:这个方法与get()方法类似,可以用来取出字典中指定键的值。

                  当指定的键存在于字典中时,返回该键对应的值。

>>> stu = {'Lily': 'python5', 'Jack': 'python5'}
>>> stu.setdefault('Jack')    # 字典中有这个键,取出对应键的值
'python5'
>>> stu    # 原字典不变
{'Lily': 'python5', 'Jack': 'python5'}

  setdefault()方法可指定第二个可选参数,此参数默认值为None,当指定的键不存在于字典中时,若无第二个参数,则返回默认值None,若有第二个参数,则返回get方法的第二个参数给定的值,并将此键值对添加到字典中。

>>> stu
{'Lily': 'python5', 'Jack': 'python5'}
>>> stu.setdefault('Alice', 'c++7')    # 键不在字典中,返回其指定值,默认None
'c++7'
>>> stu    # 并将此键值对添加到字典中
{'Lily': 'python5', 'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.setdefault('Tom')    # 没有指定第二个参数的值,默认None
>>> stu    # 添加到字典中的键值对的值就为None
{'Lily': 'python5', 'Alice': 'c++7', 'Tom': None, 'Jack': 'python5'} 

 items()方法:取出字典中所有的键值对,返回一种名为字典视图的特殊类型,其结果可迭代。

>>> stu
{'Lily': 'python5', 'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.items()    # 将键值对放在元组中,所有的元组放在列表中,返回dict_ items类对象
dict_items([('Lily', 'python5'), ('Alice', 'c++7'), ('Jack', 'python5')])

  keys()方法:取出字典中所有的键,返回的结果可迭代。

>>> stu
{'Lily': 'python5', 'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.keys()    # 将所有的键放在列表中,返回一个dict_keys类对象
dict_keys(['Lily', 'Alice', 'Jack'])

  values()方法:取出字典中所有的值,返回的结果可迭代。

>>> stu
{'Lily': 'python5', 'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.values()    # 将所有的值放在列表中,返回一个dict_values类对象
dict_values(['python5', 'c++7', 'python5'])
 

pop()方法:删除字典中的键值对。这个方法必须指定一个参数键。

                  当指定的键存在于字典中时:

>>> stu
{'Lily': 'python5', 'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.pop('Lily')   # 删除指定的键及其值,并将值返回
'python5'
>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}

  这个方法可以指定第二个可选参数,当指定的键不存在于字典中时,就返回方法中指定的第二个参数的值。

>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.pop('Bob', 'java3')    # 指定的键不存在与字典中,返回第二个参数指定的值
'java3'
>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}

  当指定的键不存在于字典中且不知道第二个参数时,报错。

>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.pop('Bob')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Bob'

  字典中的这个pop方法必须指定一个键作为参数,若没有参数,也报错,这与列表中的pop方法不同。

>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop expected at least 1 arguments, got 0

  popitem()方法:没有任何参数,它随机删除字典中的一个键值对,并以元组的形式将这个删除的键值对返回。

>>> stu
{'Alice': 'c++7', 'Jack': 'python5'}
>>> stu.popitem()
('Alice', 'c++7')    # 将删除的键值对以元组的形式返回

  当字典为空时,若继续删除,则报错。

>>> stu
{}
>>> stu.popitem()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'

update()方法:更新原字典,其返回值为None。它的参数可以是字典,或其他某种可迭代的对象。

>>> stu1 = {'Alice': 'c++7', 'Jack': 'python5'}
>>> stu2 = {'A':123}
>>> stu1.update(stu2)    # 参数为字典,将字典stu2纳入stu1中,更stu1
>>> stu1
{'Alice': 'c++7', 'A': 123, 'Jack': 'python5'}
>>> stu2    # 字典stu2不变
{'A': 123}
>>> stu2.update([('B', 333), ('D', 99)])  # 参数为列表中以元组为元素,每个元组作为一个键值对
>>> stu2
{'B': 333, 'D': 99, 'A': 123}

  引例:

>>> stu = {'name':'Jack', 'age':22}
>>> stu1 = stu    # 这种方式只是假装拷贝
>>> stu1
{'name': 'Jack', 'age': 22}
>>> id(stu)    
139817437969096
>>> id(stu1)    # 两者地址完全相同
139817437969096

  这种用赋值的方式实现的所谓“假装拷贝”,真实情况是两个变量和同一个对象之间建立了引用关系。修改任意一个,另一个也会随着改变。

>>> stu1['sex'] = 'm'
>>> stu1    # 修改了stu1
{'name': 'Jack', 'sex': 'm', 'age': 22}
>>> stu    # stu也随着改变
{'name': 'Jack', 'sex': 'm', 'age': 22}

copy()方法:复制字典对象。得到的新的字典和原字典内容一致,但他们存于不同的内存空间中。修改其中一个不会对另一个产生影响。

>>> stu
{'name': 'Jack', 'sex': 'm', 'age': 22}
>>> stu
{'name': 'Jack', 'sex': 'm', 'age': 22}
>>> stu2 = stu.copy()    # 复制
>>> stu2
{'name': 'Jack', 'age': 22, 'sex': 'm'}
>>> id(stu)
139817437969096
>>> id(stu2)    # 二者内存地址不同
139817437425608
>>> stu2['age'] = 33    # 修改stu2
>>> stu2
{'name': 'Jack', 'age': 33, 'sex': 'm'}
>>> stu    # 不会对stu产生影响
{'name': 'Jack', 'sex': 'm', 'age': 22}

  再看下面这种情况:

>>> x = {'name':'Jack', 'lang':['python', 'java', 'c++']}
>>> y = x.copy()    # 复制x并赋值给y
>>> y
{'name': 'Jack', 'lang': ['python', 'java', 'c++']}
>>> id(x)
139817437431560
>>> id(y)    #  x和y的内存地址也不同
139817437423304

>>> y['name'] = 'Alice'    # 修改y中的name键的值
>>> y
{'name': 'Alice', 'lang': ['python', 'java', 'c++']}
>>> x    # x中不会发生改变
{'name': 'Jack', 'lang': ['python', 'java', 'c++']}
>>> y['lang'].remove('c++')    # 修改y中的lang键的内容
>>> y
{'name': 'Alice', 'lang': ['python', 'java']}
>>> x    # x中的lang键的内容随之改变
{'name': 'Jack', 'lang': ['python', 'java']}

分析上述原因:由两个对象的内存地址可发现,x和y的内存地址不同,x的name键值对的内存地址和y的也不同;但是x的lang键的内存地址却和y的相同,即这两个对象的键值对之一的值——列表是同一个对象,但其字符串类型的值却是不同的对象。

         至此,我们可以简要作结论:当copy()的时候,列表、元组等对象任然是复制了引用,并没有建立一个新的对象。我们称之为“浅拷贝”。

>>> id(x['name'])
139817437434800
>>> id(y['name'])    # 二者不同
139817437435584
>>> id(x['lang'])
139817437431112
>>> id(y['lang'])    # 两者相同
139817437431112
# 元组时,依然相同
x1 = {'name': 'Jack', 'lang': ('python', 'java')}   
>>> x1
{'name': 'Jack', 'lang': ('python', 'java')}
>>> y = x1.copy()
>>> y
{'name': 'Jack', 'lang': ('python', 'java')}
>>> id(y['lang'])
139817437431624
>>> id(x1['lang'])
139817437431624

  引入“深拷贝”:python中有个copy模块,可以解决“深拷贝”的问题。

>>> import copy    # 导入copy模块
>>> x
{'name': 'Jack', 'lang': ['python', 'java']}
>>> y = copy.deepcopy(x)    # 深拷贝
>>> y
{'name': 'Jack', 'lang': ['python', 'java']}
>>> id(x['lang'])    # x的lang(列表对象)和y的不再相同
139817437431112
>>> id(y['lang'])
139817408632648
>>> y['lang'].remove('java')    # 修改y的lang(列表对象)
>>> y
{'name': 'Jack', 'lang': ['python']}
>>> x    # x的不再随之改变
{'name': 'Jack', 'lang': ['python', 'java']}

 

posted @ 2018-09-03 10:36  从python开始  阅读(1155)  评论(0编辑  收藏  举报