#!/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得到两个键值对?
答案 0 :(得分:2)
看看python的data model。字典和列表是可变对象,这就是全局定义的字典例如不需要声明global
的原因。他们的内容可能随时更改。
要理解可变性,请考虑python中的字符串。它们是不可变的对象。例如,您可以替换给定字符串的内容,但这样做时,解释器会创建一个新的字符串对象,从而为该字符串对象提供一个新的标识(以及一个内存地址)。
>>> s = "foo"
>>> id(s)
140202745404072
>>> s = "bar"
>>> id(s)
140202745404112
答案 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是可变的,它会得到更新。