我有以下代码:
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:
只需返回新的dictionary并将这个返回值赋给
main()
函数中的my_dict
。在输出应为:
^{pr2}$更简单的方法是直接返回
{'b' : 2}
,甚至不生成本地my_dict
变量,如下所示:这基本上与直接将新值
{'b' : 2}
赋给变量(my_dict = {'b' : 2}
)是一样的,你甚至不需要一个函数,除非你的字典的新值依赖于它以前的值。在为什么
main()
函数中的my_dict
变量没有被修改?在将变量传递给函数时,函数不会直接使用它。 它只使用这个变量的一个副本,一个只存在于函数中的新变量。在
因此,在某种程度上,您有两个
my_dict
变量: -你的modify_dict()
函数中的一个。 -以及你的main()
函数中的一个。在在您的
modify_dict()
函数中编辑my_dict
时,您不会编辑main()
函数中的my_dict
,而只是它的一个副本。在modify_dict
的my_dict
参数是函数的局部变量。它本身只是一个局部变量的引用。如果你打开并修改它所指向的词典,那就行了。例如:会增加你的字典。实际上,您只需将一个新字典赋给函数中名为my_dict的局部变量。在
作为@vmonteco suggests,实现这一点的最佳方法是从函数返回新字典并指定返回值。在
这是一个有趣的问题,我试着试一试。我的主要编程语言是Java,但我认为CPython&JVM在本例中是相同的。在
在程序运行时,它得到堆栈和堆,堆栈用于方法调用上下文存储,堆用于全局对象存储。在
好的,那么,以您的代码为例
第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变量相同,,但它是一个副本)。(事实上,问题已经在这里得到了回答)
第三步:
我的字典(堆中dict(1)的参考点)现在被分配给堆中的一个新dict(2),记住我的字典现在和我的主字典不一样,它们指向堆中的两个不同的dict。在
第四步:
程序返回到主函数,程序将从堆栈中拉出内容,我的字典现在指向dict(1),dict(1)在modify-dict函数中不是modify
对不起,我的英语很差:)
相关问题 更多 >
编程相关推荐