作为函数输入的python字典作为函数的全局函数而不是本地函数 [英] python dictionary passed as an input to a function acts like a global in that function rather than a local

查看:151
本文介绍了作为函数输入的python字典作为函数的全局函数而不是本地函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很困惑以下的行为。案例1,3和4按照我的预期执行,但情况2不符合。为什么case 2允许函数全局更改字典条目的值,即使字典永远不会被函数返回?我使用函数的主要原因是将函数中的所有内容与其余代码隔离开,但是如果我选择在函数内部使用相同的变量名,这似乎是不可能的。我的理解是,函数中明确定义的任何东西都是该函数的局部的,但是如果字典定义并作为的输入传递,那么似乎并不是这样。 p>

  Python 2.7.2+(默认,2011年10月4日,20:06:09)
[GCC 4.6.1] on linux2
输入help,copyright,credits或license了解更多信息。

=============案例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 ===============
(由此问题解释:

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


Python的参数传递与您所使用的语言有所不同,可能习惯了。 python已经按名称传递,而不是通过值显式传递并通过引用语义。您本质上总是传递对象本身,并且对象的可变性决定是否可以修改它。列表和列表是可变对象。数字,字符串和元组不是。



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



为了避免这种情况,您应该首先在调用函数之前或从函数内复制字典将字典传递给 dict 函数应该这样做)。


I am very confused by the behaviour below. Cases 1, 3, and 4 perform as I would expect, but case 2 does not. Why does case 2 allow the function to change the value of the dictionary entry globally, even though the dictionary is never returned by the function? A main reason I am using functions is to isolate everything in the function from the rest of the code, but this does not seem to be possible if I choose to use the same variable names inside of the function. I was under the understanding that anything explicitly defined in a function is local to that function, but this does not seem to be the case if the dictionary is defined and passed as an input to the function.

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.

=============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=============== (explained by this question: Global dictionaries don't need keyword global to modify them?)

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

解决方案

Python's parameter passing acts a bit different than the languages you're probably used to. Instead of having explicit pass by value and pass by reference semantics, python has pass by name. You are essentially always passing the object itself, and the object's mutability determines whether or not it can be modified. Lists and Dicts are mutable objects. Numbers, Strings, and Tuples are not.

You are passing the dictionary to the function, not a copy. Thus when you modify it, you are also modifying the original copy.

To avoid this, you should first copy the dictionary before calling the function, or from within the function (passing the dictionary to the dict function should do it).

这篇关于作为函数输入的python字典作为函数的全局函数而不是本地函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆