【练习】字典的循环遍历:实现多层级节点存取
关键点:字典、列表、集合等可变类型,若将一个可变类型赋给变量A和B,通过B改变了该可变类型内部的元素,指向该可变类型内存地址的变量A的值一样会跟着改变(因A、B同时指向了一个内存地址)
>>> a={"AB":"ab","CD":"cd"} >>> b=a >>> id(a) 33380536 >>> id(b) 33380536 >>> >>> b["AB"]="efg" >>> b {'AB': 'efg', 'CD': 'cd'} >>> a {'AB': 'efg', 'CD': 'cd'} >>> id(a) 33380536 >>> id(b) 33380536 >>>
题目:利用字典实现多层级节点的增加、查询功能,并且通过pickle序列化的方式保存为文件。
1 import pickle 2 import os 3 import time 4 5 if os.path.isfile('db.pk1'): 6 print("载入数据库,请稍候…………") 7 time.sleep(2) 8 f = open("db.pk1", "rb") 9 db = pickle.load(f) 10 f.close() 11 print("数据库加载完毕。") 12 path = [] 13 while True: 14 tmp = db 15 if path: 16 for item in path: 17 if item in list(tmp.keys()): 18 tmp = tmp[item] 19 else: 20 print("无此节点,请重新输入") 21 print("当前节点下的子节点为:", list(tmp.keys())) 22 23 choice = input("请选择:1、查看节点\t2、添加节点\t3、返回上级\t4、退出\n>>>>>") 24 if choice == "1": 25 n = input("请输入节点名称>>>") 26 path.append(n) 27 28 elif choice == "2": 29 name = input("请输入节点名称:") 30 tmp[name] = {} 31 elif choice == "3": 32 if path: 33 path.pop() 34 else: 35 print("已经是根节点,无法返回。") 36 elif choice == "4": 37 print("保存数据库,请稍等……") 38 time.sleep(2) 39 f = open("db.pk1", "wb") 40 pickle.dump(db, f, True) 41 print("保存成功,程序退出。") 42 break 43 else: 44 print("输入错误请重新输入") 45 elif not os.path.isfile('db.pk1'): 46 choice1 = input("数据库不存在,是否初始化数据库:Y\\N\n>>>") 47 if choice1.lower() == "y": 48 db = {} 49 time.sleep(2) 50 f = open("db.pk1", "wb") 51 pickle.dump(db, f, True) 52 f.close() 53 print("初始化成功。") 54 55 elif choice1.lower() == "n": 56 print("无法初始化数据库,程序退出。")