繁体   English   中英

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

[英]Modifying global dictionary in python within a function

#!/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同时获得两个键值对?

看一下python的数据模型 字典和列表是可变对象,这就是为什么例如全局定义的字典不需要声明为global 它们的内容可以随时更改。

要了解可变性,请考虑python中的字符串。 它们是一个不变的对象。 例如,您可以替换给定字符串的内容,但这样做时,解释程序将创建一个新的字符串对象,从而为该字符串对象赋予一个新的标识(并因此赋予一个内存地址)。

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

我之前已经回答了几个 类似的问题,所以请看看是否可以从中找到更多信息。

一个快速的解决方法是在功能的本地范围内复制字典。

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}

Python搜索变量基于LEGB规则:

Local, Enclosing functions, Global, Built-in

调用函数时,它将尝试查找名为d的变量,并且自从在调用函数之前创建d以来便会在全局范围内查找。 并且由于d是可变的,因此它将被更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM