Python(10)--字典--深浅复制
Posted mr-chenshuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python(10)--字典--深浅复制相关的知识,希望对你有一定的参考价值。
映射:
通过名称来访问值的数据结构
字典:
字典是Python唯一的内置映射类型
字典的值是无序的,存储在键下
键可以是数、字符串、元组
键必须是独一无二的
创建和使用字典:
字典是由花括号{}括起来的键值对
一个键值对为一项
每隔键和值都用冒号:分隔
项之间用逗号,分隔
空字典用就是空的花括号表示
>>> phonebook = {"Bne": 123, "Yuan": 456, "Bone": 789} >>> namebook = {} >>> phonebook {‘Bne‘: 123, ‘Yuan‘: 456, ‘Bone‘: 789} >>> namebook {}
函数dict:
可以使用dict函数从其他映射或者键值对序列创建字典
>>> items = [("name", "Yuan"), ("age", 23)] >>> d = dict(items) >>> d {‘name‘: ‘Yuan‘, ‘age‘: 23} >>> d["name"] ‘Yuan‘ # 还可以使用关键字参数 >>> d = dict(name="Yuan", age=23) >>> d {‘name‘: ‘Yuan‘, ‘age‘: 23}
跟str、list、tuple一样,如果没有提供参数,dict返回的是一个空字典
>>> list() [] >>> str() ‘‘ >>> tuple() () >>> dict() {}
字典操作:
# len(d)返回字典包含的项的数量 >>> d {‘name‘: ‘Yuan‘, ‘age‘: 23} >>> len(d) 2 # d[k]返回与键k相关联的值 >>> d {‘name‘: ‘Yuan‘, ‘age‘: 23} >>> d["age"] 23 # d[k] = v 将值v关联到k,若存在则修改,不存在则添加 >>> d {‘name‘: ‘Yuan‘, ‘age‘: 23} >>> d["name"] = "Bone" >>> d {‘name‘: ‘Bone‘, ‘age‘: 23} >>> d["aaa"] = "song" >>> d {‘name‘: ‘Bone‘, ‘age‘: 23, ‘aaa‘: ‘song‘} # del d[k] 删除键为k的项 >>> d {‘name‘: ‘Bone‘, ‘age‘: 23, ‘aaa‘: ‘song‘} >>> del d["aaa"] >>> d {‘name‘: ‘Bone‘, ‘age‘: 23} # k in d 检查字典d是否包含键为k的项 >>> d {‘name‘: ‘Bone‘, ‘age‘: 23} >>> "name" in d True >>> "a" in d False
- 键的类型:字典中的键可以使任何不可变的类型
- 自动添加:给字典中没有的键赋值,就会在改字典中创建一个新的项
- 成员资格:列表v in l 查找的是值,而字典的k in d 查找的是键不是值,通过找到键再检查相应的值
format_map:将字符串格式设置功能用于字典
通过在字典中存储一系列命名的值,使得格式设置更简单
>>> phonebook {‘Bne‘: 123, ‘Yuan‘: 456, ‘Bone‘: 789} >>> "Yuan‘s phone number is {Yuan}".format_map(phonebook) "Yuan‘s phone number is 456"
字典方法:
clear() 删除字段所有项
>>> d {‘name‘: ‘Bone‘, ‘age‘: 23} >>> d.clear() >>> d {}
copy() 返回一个副本,包含的项和原字典相同(浅复制)
>>> x = {"a": 123, "b": 444, "c": [1, 2, 6, "asd"]} >>> y = x.copy() >>> y["c"].remove("asd") >>> y["a"] = "xxx" >>> y {‘a‘: ‘xxx‘, ‘b‘: 444, ‘c‘: [1, 2, 6]} >>> x {‘a‘: 123, ‘b‘: 444, ‘c‘: [1, 2, 6]} # 这个方法执行的是浅复制,浅复制不会复制子对象,所以原始数据改变,子对象也会改变
deepcopy() copy模块中的函数,执行深复制,同时复制值和其包含的所有值
>>> from copy import deepcopy >>> x = {"c": [1, 2, 6, "asd"]} >>> y = x.copy() >>> z = deepcopy(x) >>> x["c"].append("666") >>> x {‘c‘: [1, 2, 6, ‘asd‘, ‘666‘]} >>> y {‘c‘: [1, 2, 6, ‘asd‘, ‘666‘]} >>> z {‘c‘: [1, 2, 6, ‘asd‘]}
# 深复制,包含对象里面的子对象的复制,所以原始对象的改变不会造成深拷贝里任何子元素的改变
fromkeys(seq[, val]) 返回一个字典,键都来自seq,值都为val(默认是None),可直接用dict调用
>>> {}.fromkeys(["name", "age"]) {‘name‘: None, ‘age‘: None} # 上面先创建以个空字典然后调用方法来生成一个新字典,显然多余了,可以直接用dict调用 >>> dict.fromkeys(["name", "age"], "---") {‘name‘: ‘---‘, ‘age‘: ‘---‘} >>>
get(key[, defaule]) 访问字典的项,使用get访问不存在的键,不会报错,而是返回指定的defaule(默认是None)
>>> d {} >>> print(d["name"]) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: ‘name‘ >>> print(d.get("name")) None
items() 返回一个迭代器(实际是一个视图),包含字典的各项(key, value)对
>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"} >>> d.items() dict_items([(‘name‘, ‘Bone‘), (‘age‘, 25), (‘url‘, ‘www.python.org‘)])
keys() 返回一个字典视图,包含字典的key
>>> d {‘name‘: ‘Bone‘, ‘age‘: 25, ‘url‘: ‘www.python.org‘} >>> d.keys() dict_keys([‘name‘, ‘age‘, ‘url‘])
values() 返回一个字典视图,包含字典的value
>>> d {‘name‘: ‘Bone‘, ‘age‘: 25, ‘url‘: ‘www.python.org‘} >>> d.values() dict_values([‘Bone‘, 25, ‘www.python.org‘])
pop(key[, d]) 删除并返回给定键的值,并删除键值对
>>> d {‘name‘: ‘Bone‘, ‘age‘: 25, ‘url‘: ‘www.python.org‘} >>> d.pop("name") ‘Bone‘
popitem() 随机删除一项,并返回键值对
>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"} >>> d.popitem() (‘url‘, ‘www.python.org‘)
setdefault(key[, default]) 类似get,如果key存在就返回对应的值,不存在就添加到字典中
>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"} >>> d.setdefault("name") ‘Bone‘ >>> d.setdefault("aa") >>> d {‘name‘: ‘Bone‘, ‘age‘: 25, ‘url‘: ‘www.python.org‘, ‘aa‘: None} >>> d.setdefault("aaa", "haha") ‘haha‘ >>> d {‘name‘: ‘Bone‘, ‘age‘: 25, ‘url‘: ‘www.python.org‘, ‘aa‘: None, ‘aaa‘: ‘haha‘}
update(other) 使用一个字典的项来更新另一个字典
>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"} >>> x = {"x": 1, "y":2, "age": 18} >>> d.update(x) >>> d {‘name‘: ‘Bone‘, ‘age‘: 18, ‘url‘: ‘www.python.org‘, ‘x‘: 1, ‘y‘: 2} >>> x {‘x‘: 1, ‘y‘: 2, ‘age‘: 18}
以上是关于Python(10)--字典--深浅复制的主要内容,如果未能解决你的问题,请参考以下文章