Python中loadInventory函数返回字典后外部未更新问题求助
问题:loadInventory函数返回字典后外部字典未更新
我的字典数据来自txt文件,格式已经调整好适配其他函数,但遇到一个问题:loadInventory函数内部的字典能正常输出,但即使函数返回了字典,外部的dictionary变量值却没更新;其他函数(比如addProduct、saveInventory)返回字典或值都正常。
相关代码如下:
def addProduct(dictionary): prod_id = input("Enter prod ID: ") prod_name = input("Enter prod name: ") prod_input = input("Enter prod desc: ") prod_quantity = int(input("Enter prod quality: ")) dictionary[prod_id] = [prod_name,prod_input,prod_quantity] return dictionary def saveInventory(dictionary): save = open('inventory.dat', 'w') for key, value in dictionary.items(): save.write(key + '\n') save.write(value[0] + '\n') save.write(value[1] + '\n') save.write(str(value[2]) + '\n') save.close() return dictionary def loadInventory(dictionary): dicty = {} n = 4 with open('inventory.dat','r') as file: your_list = [line.strip() for line in file.readlines()] final = [your_list[i * n:(i + 1) * n] for i in range((len(your_list) + n - 1) // n )] dictionary= dict((value[0], value[1:]) for value in final) print(dictionary) return dictionary dictionary= {} prodID = "" # 主菜单代码 loop = True while loop: menu() menuoption = int(input("Enter Choice: ")) if menuoption == 1: addProduct(dictionary) elif menuoption == 7: loadInventory(dictionary) elif menuoption == 8: saveInventory(dictionary)
原因分析
问题出在两个点:
loadInventory函数内部,你直接给参数dictionary重新赋值了新字典(dictionary= dict(...)),这会让函数内的dictionary指向新的内存对象,和外部传入的原字典彻底断开关联。- 调用
loadInventory时,你没有把返回的新字典赋值给外部的dictionary变量,所以外部字典自然不会更新。
修复方案
有两种简单的修复方式:
方式一:修改loadInventory,直接操作原字典
把函数里的重新赋值改成清空原字典再更新内容,这样就不会断开和外部字典的关联:
def loadInventory(dictionary): n = 4 with open('inventory.dat','r') as file: your_list = [line.strip() for line in file.readlines()] final = [your_list[i * n:(i + 1) * n] for i in range((len(your_list) + n - 1) // n )] # 清空原字典,批量添加新数据 dictionary.clear() dictionary.update(dict((value[0], value[1:]) for value in final)) print(dictionary) return dictionary
这种方式下,原调用代码不需要改,因为直接修改了外部传入的字典内容。
方式二:调用时接收返回值
保持loadInventory函数不变,修改主菜单里的调用逻辑,把返回的新字典赋值给外部变量:
elif menuoption == 7: dictionary = loadInventory(dictionary)
这样外部的dictionary就会被替换成函数返回的新字典,实现更新。
另外提一句:addProduct能正常工作是因为它直接修改了原字典的键值对,而不是重新赋值,不过为了代码一致性,也可以改成dictionary = addProduct(dictionary)。
内容的提问来源于stack exchange,提问作者Emilia Feria
相关产品推荐
相关产品推荐

