类似于列表,字典也已经提供了各种操作,方便对字典的使用。例如添加,移除,清空等。
clear方法
clear 方法就是清除字典中的所有项,这个是原地操作方法,没有返回值。使用示例代码:
# 字典 clear 方法
x ={}
y = x
x["key"]="value"
print(x)
x={}
print(x)
print(y)
print ("字典 clear 方法的使用 ")
x1 ={}
y1 = x1
x1[ "key" ]="KeyValue"
print (x1)
print (y1)
x1.clear() # 字典清空
print(x1)
print(y1)
在上面的代码中,x={},y=x,然后向x中添加元素:x[“key”]=“value” ,这个时候打印x,可以得到结果:{‘key’: ‘value’}。那么,如果把x重新设置为{},再打印x,y结果是什么呢?可以看到x清空了,但y的结果是:{‘key’: ‘value’},这就说明x、y已经指向了不同的内容。不能因为y = x就认为清空了x就清空了y。那么,继续,如果对x做clear操作,结果是什么呢?这个时候,x和y都是空的了:
{'key': 'value'}
{}
{'key': 'value'}
字典 clear 方法的使用
{'key': 'KeyValue'}
{'key': 'KeyValue'}
{}
{}
通过clear清空了字典,但由于x、和y指向了同一个字典,因此,结果二者都被清空了。实例结果:
copy方法
copy方法 (浅复制shallow copy) :返回一个具有相同键-值对的新字典。注意:copy 后,如果修改字典里面的值,原字典和新字典里面的值都会变化,如果只是操作字典,则相互不影响,这就是浅拷贝。示例方法:
# 字典下的 copy 方法
x = {"username" :"admin" ,"cars" :["benz" ,"audi" ]}
y = x.copy()
y[ "username" ] = "Bob"
y[ "cars" ].remove( "audi" )
print(y)
print(x)
结果:
{'username': 'Bob', 'cars': ['benz']}
{'username': 'admin', 'cars': ['benz']}
可以看到,对y操作的时候,如果是字典值类型操作相互不影响,这就是修改y[ “username” ]之后,x不改变的原因;但如果修改引用类型的值,例如cars是个列表,对列表内容的操作将影响到x。
再来看一个实例,初始化一个新的student_info字典,里面有Alice和Bob两个键,其中Bob是一个列表类型,里面包含了两个元素,分别是电话号码和性别。
在代码45行,打印整个字典的内容,46行,对字典进行了浅拷贝,并赋值给copy_student_info变量。修改copy_student_info里面Alice键,将值设置为“1111”,打印结果,可以看到,改动只对copy_student_info生效,不影响原字典。但是,如果将copy_student_info中的Bob删除元素“5555”,再打印结果,就可以看到,原数组和拷贝数组都被改变了!
deepcopy方法
deepcopy 函数是一种深拷贝 ,不仅拷贝字典,同时将字典中元素进行依次深拷贝。不同于浅拷贝,深拷贝之后两个字典将不会再有任何关联。使用示例:
from copy import deepcopy
d = {}
d[“names”] = [“Alfred ”,“Bertrand ”]
c = d.copy()
dc = deepcopy(d)
d[ “names”].append( “Bob ”)
print (c)
print (dc)
结果:
{"names": ["Alfred","Bertrand","bob"]}
{"names": ["Alfred","Bertrand"]}
以上代码,d是一个字典,names赋值为[“Alfred”,“Bertrand”],是一个列表,c是d的浅拷贝,dc是d的深拷贝,当修改原始字典,向names添加一个元素之后,打印c和dc。
可以看到,浅拷贝的c被影响,而深拷贝的dc不影响。代码执行:
get方法
get方法是个更宽松的访问字典项的方法。与下标访问功能类似,当功能更加强大。使用示例:
d = {"name" : "bob" }
print (d) # print(d["name"]) 运行该没问题
print (d.get("name", "no value or key" ))
# print(d["sex"]) sex 不存在,运行该会报错
print(d.get("sex","no value or key"))
结果:
{'name': 'bob'} {'name': 'bob'}
bob
no value or key
看上述代码,get方法有两个参数,第一个是需要访问的键,第二个是默认值,如果没有这个键,则返回一个默认值。d = {“name” : “bob” },在第三行,当访问name字段的时候,因为name字段存在于字典,因此,打印结果为bob,
print(d.get("sex","no value or key"))
访问的sex键,因为不存在,所以返回了默认值:no value or key。
实例代码展示:
可以看到,获取已经存在的键,返回对应的值;如果不存在则返回默认值。而对于下标访问操作[],如果键不存在则直接报错了,这就是get方法带来的便利~