当前位置: 首页 > 面试题库 >

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

童花蜂
2023-03-14
问题内容

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

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.

============案例1 ===============

>>> 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来修改它们?)

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

问题答案:

Python的参数传递与您可能习惯的语言有点不同。python没有按值显式传递和按引用语义传递,而是通过名称传递。本质上,您总是在传递对象本身,而对象的可变性决定了是否可以对其进行修改。列表和字典是可变对象。数字,字符串和元组则不是。

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

为避免这种情况,您应该在调用函数之前先复制字典,或者从函数内部复制字典(将字典传递给dict函数即可)。



 类似资料:
  • 问题内容: 我想使用字典在python中调用一个函数。 这是一些代码: 这可以打印,但我希望只打印test。 我希望它可以类似地工作以获取更多参数: 这可能吗? 问题答案: 最后自己解决了。很简单,我只是缺少运算符来解开字典 因此,我的示例变为:

  • 问题内容: 我的密码 第一个文件: 第二档: 在上面的代码中,仅将“数据”字典的键传递给,但我希望键值对传递。如何纠正呢? 我希望这样被修改 这是我的要求,根据此给出答案 编辑: 字典键 类 更改为 标准 问题答案: 如果要像这样使用它们,请正常定义变量名称的函数: 现在,您可以在 调用 函数时使用: 它会按您想要的方式工作。 PS 请勿使用。等保留字(例如,改用)

  • 我有以下Powershell代码: 我应该如何声明可以传递给函数的局部变量。我的局部变量$file被填充,但当我将其作为其他函数的参数时,它就像它超出了范围。 我读了关于scopes的文章,但没能弄明白。 当前我收到错误: ini文件:D:\Projects\scripts\Configs\HBOX。ini测试路径:无法将参数绑定到参数“Path”,因为它是空字符串。在D:\项目\自由职业者。co

  • 全局函数 返回上级 DirectDrawCreate DirectDrawCreateClipper DirectDrawEnumerate DirectDrawEnumerateEx DirectDrawCreate 返回目录 创建一个DirectDraw对象的实例。 HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW

  • debug 调试打印PHP变量,并中断执行。等同于 var_dump($var1, $var2);die; table 将任意MySQL表构造成Model对象。 table($table_name, $db_object_id); model 创建模型对象。 model($model_name, $db_object_id);