zoukankan      html  css  js  c++  java
  • 字典中的方法

      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']}
  • 相关阅读:
    这个夏天,感动我的歌,感动我的你
    设计中最困难的部分在于决定要设计什么 设计原本择录
    Sql效能优化总结(续) sql语句优化篇
    sql效能优化总结
    使用AStyle进行代码格式化
    迭代模型 转
    软件项目开发系列开篇杂谈
    Sql效能优化总结(续) 架构调整篇
    throw和throw ex的区别
    面向过程&面向对象 UML&RUP
  • 原文地址:https://www.cnblogs.com/wgbo/p/9577260.html
Copyright © 2011-2022 走看看