作为函数输入传递的 python 字典在该函数中的作用类似于全局函数,而不是局部函数

2024-03-19

我对下面的行为感到非常困惑。情况 1、3 和 4 的表现符合我的预期,但情况 2 却没有。为什么情况 2 允许函数全局更改字典条目的值,即使函数从未返回字典?我使用函数的一个主要原因是将函数中的所有内容与代码的其余部分隔离,但如果我选择在函数内部使用相同的变量名称,这似乎是不可能的。我的理解是,函数中显式定义的任何内容都是该函数的本地函数,但如果字典是本地函数,则情况似乎并非如此定义并作为函数的输入传递.

Case 1

>>> def testfun1(a):
...     a=2
... 
>>> a=0
>>> testfun1(a)
>>> a
0

Case 2

>>> def testfun2(b):
...     b['test']=2
... 
>>> b={}
>>> testfun2(b)
>>> b
{'test': 2}

Case 3

>>> def testfun3():
...     c=2
... 
>>> c=0
>>> testfun3()
>>> c
0

Case 4

(通过这个问题解释:全局字典不需要关键字global来修改吗? https://stackoverflow.com/questions/14323817/global-dictionaries-dont-need-keyword-global-to-modify-them)

>>> def testfun4():
...     d['test']=10
... 
>>> d={}
>>> testfun4()
>>> d
{'test': 10}

Python 的“参数评估策略”与您可能习惯的语言有点不同 http://lucumr.pocoo.org/2011/7/9/python-and-pola/#pass-by-what-exactly。 python 没有显式的按值调用和按引用调用语义,通过共享来电 https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing。本质上,您总是传递对象本身,并且对象的可变性决定了它是否可以修改。列表和字典是可变对象。数字、字符串和元组则不然。

您将字典传递给函数,而不是副本。因此,当您修改它时,您也在修改原始副本。

为了避免这种情况,你应该首先抄字典 https://stackoverflow.com/questions/2465921/how-to-copy-a-dictionary-and-only-edit-the-copy在调用函数之前,或在函数内部(将字典传递给dict函数应该做到这一点,即testfun4(dict(d))并将函数定义为def testfun4(d):).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作为函数输入传递的 python 字典在该函数中的作用类似于全局函数,而不是局部函数 的相关文章

随机推荐