Python字典传参作用域混淆与原地反转实现逻辑确认
需求说明
需要编写字典反转函数,题目禁止使用return语句,核心要求是直接修改传入的原始字典。Python中字典是可变对象,作为参数传入函数时传递的是对象引用,因此直接在原对象上修改即可满足无返回值的要求。
第一次尝试的问题
首次实现代码如下:
def invert (dictionary: dict): dictionary = {value : key for key, value in dict.items(dictionary)} print(dictionary) if __name__ == "__main__": s = {1: 100, 2 : 200} invert(s) print(s)
这段代码无法修改外部原字典,核心原因是:函数内的dictionary = {xxx}属于赋值操作,没有修改原引用指向的字典对象,只是让函数局部作用域内的dictionary变量重新绑定到了新创建的字典对象,此时函数内部已经丢失了对原始传入字典的引用。
针对你的疑问:原始字典未发生变化,并不是全局作用域变量在局部被修改导致的。Python的赋值逻辑本质是「变量名与对象的绑定」,函数参数
dictionary本身是函数内部的局部变量,初始状态下绑定到外部传入的原字典;给这个局部变量重新赋值,只会改变局部变量的绑定关系,完全不会影响外部全局变量和原始字典对象,你的判断是准确的。
第二次尝试的问题
第二次尝试先创建反转后的新字典,再尝试赋值给局部变量,代码如下:
def invert (dictionary: dict): inverted_dictionary={} inverted_dictionary = {value : key for key, value in dictionary.items()} print(inverted_dictionary) dictionary = inverted_dictionary print(dictionary) if __name__ == "__main__": s = {1: 10, 2 : 20, 3: 30} invert(s) print(s)
这段代码的反转逻辑本身没有问题,函数内生成的inverted_dictionary是正确的反转结果,但仍然无法修改外部原字典——问题同样出在dictionary = inverted_dictionary这行赋值:它仅修改了函数内部局部变量dictionary的绑定对象,没有对原始传入的字典对象做任何变更,因此外部原字典不会发生变化。
正确实现逻辑
最终通过直接操作原字典对象的方法实现了需求,代码如下:
def invert (dictionary: dict): inverted_dictionary={} inverted_dictionary = {value : key for key, value in dictionary.items()} dictionary.clear() dictionary.update(inverted_dictionary) if __name__ == "__main__": s = {1: 10, 2 : 20, 3: 30} invert(s) print(s)
针对你的疑问:你对这段实现的理解完全正确。
dictionary.clear()是直接在原始传入的字典对象上执行操作,清空原有所有键值对;dictionary.update()同样是在原字典对象上执行操作,将反转后字典的键值对写入原对象。整个过程没有给局部变量dictionary重新绑定新对象,所有操作都作用在最初传入的原始字典引用上,因此外部原字典会被直接修改,完全符合题目禁止使用return的要求。
内容的提问来源于stack exchange,提问作者apronedsamurai

