Python的字典和列表的使用中一些需要注意的地方

Python 中有三个非常好用的数据结构,列表,元组和字典, 元组是不可变的,列表可以保存任意类型的Python对象,并可以随意扩展没有大小限制, 字典是一个key-value的键值映射的类型,可以存放任何Python对象,可以嵌套字典, 值可以是字典元组或者字典

这里说是Python 字典和列表的陷阱不如说是Python的一些特性,如果不了解这些特性 就会引发一些难以寻找的bug

下面我们来介绍这些特性

Python中所有对列表和字典的使用仅仅是对原来对象的引用而不是创建一个新的对象 如下面代码:

>>> info = dict(name='cold', blog='www.linuxzen.com') # 创建字典{'name':'cold', 'blog':'www.linuxzen.com'}
>>> info2 = info   # 赋值给info2
>>> info2['name'] = 'cold night'
>>> info
>>> info2
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> names = ['cold', 'night', 'linuxzen']
>>> names2 = names
>>> names2.append('cold night')
>>> names
['cold', 'night', 'linuxzen', 'cold night']
>>> names2
['cold', 'night', 'linuxzen', 'cold night']

大家看到如果将列表或者字典重新赋值给另外一个变量并没有达到预想的效果, 我们更改一个的同时另外一个也在同时更改,如果我们想保留一个快照,很明显我们 没有达到我们想要的效果,另外还有一种常见的使用,因为我们知道普通变量传递给 函数,函数在内部更改是不会影响到外部变量的,那么列表和字典呢? 我们来看如下代码,我们创建一个函数,是字典就添加一个键和值,是列表就在尾部添加一个元素

>>> def add_something(info):
...   if type(info) == dict:
...       info['msg'] = 'Hello,'+ info['name']
...   elif type(info) == list:
...       info.append('add to the list')
...
>>> info = {'name':'cold', 'blog':'www.linuxzen.com'}
>>> add_something(info)
>>> info
{'blog': 'www.linuxzen.com', 'msg': 'Hello,cold', 'name': 'cold'}
>>> names = ['cold', 'night', 'linuxzen.com']
>>> add_something(names)
>>> names
['cold', 'night', 'linuxzen.com', 'add to the list']

如上代码明显不是我们想要的结果,如果这个列表/字典仅仅用在一个地方可能不会发生什么 如果我们其他地方需要同样的列表进行处理,如果你不知道这个特性就会产生很难寻找的bug 当上面并不是我们想要的我们该如何避免上面呢,我们可以对列表/字典做一个拷贝,而不是 简单的引用

>>> names = ['cold', 'night', 'linuxzen.com']
>>> names2 = names[:]
>>> names2.append('cold night')
>>> names
['cold', 'night', 'linuxzen.com']
>>> names2
['cold', 'night', 'linuxzen.com', 'cold night']
>>> info = {'name':'cold night', 'blog':'www.linuxzen.com'}
>>> info2 = info.copy()
>>> info2['name'] = 'cold'
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold night'}
>>> info2
{'blog': 'www.linuxzen.com', 'name': 'cold'}

上面代码列表使用[:]可以创建一个列表的副本而不是引用 字典的copy方法同样可以创建一个字典的副本而不是引用 这样就可以避免之前所说的引用的情况

(0)

相关推荐

  • 在Python中操作字典之fromkeys()方法的使用

    fromkeys()方法从序列键和值设置为value来创建一个新的字典. 语法 以下是fromkeys()方法的语法: dict.fromkeys(seq[, value])) 参数 seq -- 这是将用于字典的键准备的值的列表. value -- 这是可选的,如果提供的话则值将被设置为这个值 返回值 此方法返回列表. 例子 下面的例子显示fromkeys()方法的使用. #!/usr/bin/python seq = ('name', 'age', 'sex') dict = dict.fr

  • Python简单定义与使用字典dict的方法示例

    本文实例讲述了Python简单定义与使用字典的方法.分享给大家供大家参考,具体如下: #coding=utf8 print ''''' Python中的字典映射数据类型是由键值对构成. python中字典一般以数字或者字符串作为键. Python中字典的值可以是任意类型的Python对象,字典元素用大括号{}包裹. ''' dicDefine={ 'Name':'ewang', 'Age': 28, 'Sex': 'famale', 'BirthDay':'1998/09/1' } print

  • 在Python中操作字典之update()方法的使用

    update()方法添加键 - 值对到字典dict2.此函数不返回任何值. 语法 以下是update()方法的语法: dict.update(dict2) 参数 dict2 -- 这是被添加dict到的词典 返回值 此方法不返回任何值 例子 下面的例子显示了update()方法的使用 #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} dict2 = {'Sex': 'female' } dict.update(dict2) print "Va

  • Python构造自定义方法来美化字典结构输出的示例

    示例: 复制代码 代码如下: d = { "root": { "folder2": { "item2": None, "item1": None }, "folder1": { "subfolder1": { "item2": None, "item1": None }, "subfolder2": { "item3&

  • 在Python中操作字典之setdefault()方法的使用

    setdefault()方法类似于get()方法,但会设置字典[键]=默认情况下,如果键不是已经在字典中. 方法 以下是setdefault()方法的语法: dict.setdefault(key, default=None) 参数 key -- 这是要被搜索的键 default -- 这是没有找到键的情况下返回的值. 返回值 此方法返回字典可用的键值,如果给定键不可用,则它会返回所提供的默认值. 例子 下面的例子显示了setdefault()方法的使用. #!/usr/bin/python d

  • Python中返回字典键的值的values()方法使用

    values()方法返回给定的字典中所有可用值的列表. 语法 以下是values()方法的语法: dict.values() 参数 NA 返回值 此方法返回在给定字典中的所有可用的值的列表. 例子 下面的例子显示values()方法的使用. #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} print "Value : %s" % dict.values() 当我们运行上面的程序,它会产生以下结果: Value : [7, 'Zar

  • Python的“二维”字典 (two-dimension dictionary)定义与实现方法

    本文实例讲述了Python的"二维"字典 (two-dimension dictionary)定义与实现方法.分享给大家供大家参考,具体如下: Python 中的dict可以实现迅速查找.那么有没有像数组有二维数组一样,有二维的字典呢?比如我需要对两个关键词进行查找的时候.2D dict 可以通过 dict_2d = {'a': {'a': 1, 'b': 3}, 'b': {'a': 6}} 来建立,并通过 dict_2d['a']['b'] 来访问.但是添加一个新的 "k

  • Python中使用items()方法返回字典元素对的教程

    items()方法返回字典的(键,值)元组对的列表 语法 以下是items()方法的语法: dict.items() 参数 NA 返回值 此方法返回元组对的列表. 例子 下面的例子显示了items()方法的使用. #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} print "Value : %s" % dict.items() 当我们运行上面的程序,它会产生以下结果: Value : [('Age', 7), ('Name', '

  • python使用点操作符访问字典(dict)数据的方法

    本文实例讲述了python使用点操作符访问字典(dict)数据的方法.分享给大家供大家参考.具体分析如下: 平时访问字典使用类似于:dict['name']的方式,如果能通过dict.name的方式访问会更方便,下面的代码自定义了一个类提供了这种方法. class DottableDict(dict): def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.__dict__ = self de

  • python使用clear方法清除字典内全部数据实例

    本文实例讲述了python使用clear方法清除字典内全部数据.分享给大家供大家参考.具体实现方法如下: d = {} d['name'] = 'Gumby' d['age'] = 42 print d returned_value = d.clear() print d print returned_value 希望本文所述对大家的Python程序设计有所帮助.

  • python创建和使用字典实例详解

    字典是python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里.键可以是数字,字符串甚至是元组.1. 创建和使用字典字典可以通过下面的方式创建: 复制代码 代码如下: phonebook = {'Alice':'2341','Beth':'9102','Ceil':'3258'} 字典由多个键及与其对应的值构成的对组成.每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来.空字典:{} 1.1 dict函数可以用di

  • 在Python中操作字典之clear()方法的使用

    clear()方法将删除字典中的所有项目(清空字典) 语法 以下是clear()方法的语法: dict.clear() 参数 NA 返回值 此方法不返回任何值. 例子 下面的例子显示了clear()方法的使用 #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7}; print "Start Len : %d" % len(dict) dict.clear() print "End Len : %d" % len(di

随机推荐