在函数内修改字典

2024-04-20 08:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

def modify_dict(my_dict):
    my_dict = {'b': 2}
    print(my_dict)


def main():
    my_dict = {'a': 1}
    modify_dict(my_dict)
    print(my_dict)

if __name__ == '__main__':
    main()

它的输出是:

^{pr2}$

我的问题是,为什么函数中对字典所做的更改没有反映在main()函数中?
另外,如何在函数内部更新字典,使更改反映在函数外部?在


Tags: 函数代码nameif字典mainmydef
3条回答

只需返回新的dictionary并将这个返回值赋给main()函数中的my_dict。在

def modify_dict():
    my_dict = {'b': 2}
    print(my_dict)    
    return my_dict

def main():
    my_dict = {'a': 1}
    my_dict = modify_dict()
    print(my_dict)

if __name__ == '__main__':
    main()

输出应为:

^{pr2}$

更简单的方法是直接返回{'b' : 2},甚至不生成本地my_dict变量,如下所示:

def modify_dict():
    return {'b' : 2}

这基本上与直接将新值{'b' : 2}赋给变量(my_dict = {'b' : 2})是一样的,你甚至不需要一个函数,除非你的字典的新值依赖于它以前的值。在

为什么main()函数中的my_dict变量没有被修改?在

将变量传递给函数时,函数不会直接使用它。 它只使用这个变量的一个副本,一个只存在于函数中的新变量。在

因此,在某种程度上,您有两个my_dict变量: -你的modify_dict()函数中的一个。 -以及你的main()函数中的一个。在

在您的modify_dict()函数中编辑my_dict时,您不会编辑main()函数中的my_dict,而只是它的一个副本。在

modify_dictmy_dict参数是函数的局部变量。它本身只是一个局部变量的引用。如果你打开并修改它所指向的词典,那就行了。例如:

def modify_dict(my_dict):
    my_dict['b'] = 2
    print(my_dict)

会增加你的字典。实际上,您只需将一个新字典赋给函数中名为my_dict的局部变量。在

作为@vmonteco suggests,实现这一点的最佳方法是从函数返回新字典并指定返回值。在

这是一个有趣的问题,我试着试一试。我的主要编程语言是Java,但我认为CPython&JVM在本例中是相同的。在

在程序运行时,它得到堆栈和堆,堆栈用于方法调用上下文存储,堆用于全局对象存储。在

好的,那么,以您的代码为例

第1步。在

my_dict = {'a': 1}

它将在中创建dict(1){'a':1},然后我的dict被引用到dict(1)的内存地址,这意味着我的dict现在指向的是一个内存地址,而不是{'a':1}本身。在

第二步。在

^{pr2}$

好的,那么我们在main函数内部调用modify_dict function,程序会把main函数的上下文放入一个堆栈(stack1),而go into函数modify_dict作为参数,现在,程序将为modify_dict函数创建一个新的堆栈,复制一个参数,这意味着我的“u dict”参数现在是一个引用副本(指向堆中的dict(1),其值与main中的myu dict变量相同,,但它是一个副本)。(事实上,问题已经在这里得到了回答)

第三步:

my_dict = {'b': 2}

我的字典(堆中dict(1)的参考点)现在被分配给堆中的一个新dict(2),记住我的字典现在和我的主字典不一样,它们指向堆中的两个不同的dict。在

第四步:

程序返回到主函数,程序将从堆栈中拉出内容,我的字典现在指向dict(1),dict(1)在modify-dict函数中不是modify

对不起,我的英语很差:)

相关问题 更多 >