在函数中修改python中的全局字典

时间:2014-09-18 06:06:09

标签: python

#!/usr/bin/env python

def modify_dict():

    d['two'] = 2

d = {'one':1}

modify_dict()

print d

我得到了

$ ./globaltest.py 
{'two': 2, 'one': 1}

我希望只看到{'one':1},因为d未在函数中声明为全局。为什么d得到两个键值对?

3 个答案:

答案 0 :(得分:2)

看看python的data model。字典和列表是可变对象,这就是全局定义的字典例如不需要声明global的原因。他们的内容可能随时更改。

要理解可变性,请考虑python中的字符串。它们是不可变的对象。例如,您可以替换给定字符串的内容,但这样做时,解释器会创建一个新的字符串对象,从而为该字符串对象提供一个新的标识(以及一个内存地址)。

>>> s = "foo"
>>> id(s)
140202745404072
>>> s = "bar"
>>> id(s)
140202745404112

我之前已回答a few similar个问题,因此请查看是否可以从中找到更多相关信息。

答案 1 :(得分:2)

快速解决方法是在函数的本地范围内复制字典。

import copy

d = {'one':1}

def modify_dict():
    local_d = copy.deepcopy(d)
    local_d['two'] = 2
    print local_d

modify_dict()
print d

您将看到以下输出:

>>>{'two': 2, 'one': 1}
>>>{'one': 1}

答案 2 :(得分:1)

Python搜索变量基于LEGB规则:

Local, Enclosing functions, Global, Built-in

当你调用你的函数时,它会尝试找到一个名为d的变量,并且在调用函数之前创建d后将在全局范围内找到它。由于d是可变的,它会得到更新。