作为输入传递给函数的python字典在该函数中充当全局而不是局部

标签 python

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

案例一

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

案例2

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

案例3

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

案例4

(由这个问题解释:Global dictionaries don't need keyword global to modify them?)

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

最佳答案

Python's "parameter evaluation strategy" acts a bit different than the languages you're probably used to . python没有显式的按值调用和按引用语义调用,而是有call by sharing。 .您本质上总是在传递对象本身,而对象的可变性决定了它是否可以被修改。列表和字典是可变对象。数字、字符串和元组不是。

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

为避免这种情况,您应该首先 copy the dictionary在调用函数之前,或从函数内部(将字典传递给 dict 函数应该这样做,即 testfun4(dict(d)) 并将函数定义为 def testfun4(d):).

关于作为输入传递给函数的python字典在该函数中充当全局而不是局部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15078519/

相关文章:

python - 从多个文件中提取数据

python - 为 celery 任务编写测试时出错

python - ERP-Next安装过程中获取 "ImportError: No module named wnf "

Python:处理包含一百万张图像的文件夹而不会出现错误

python:sudo上下文管理器?

Python map() 函数输出到 Pandas DataFrame

python - AffinityPropagation .labels_ 与 .predict()

php - 从 JSON 文件中提取/抓取特定数据

python - 通过pypdf在pdf文件上读/写xmp元数据

Python:pandas read_sql_query