Python 为什么在这种情况下不需要全局关键字?

Python 为什么在这种情况下不需要全局关键字?,python,global-variables,Python,Global Variables,输出 cache = {} def func(): cache['foo'] = 'bar' print cache['foo'] 为什么这样做?为什么不需要使用全局关键字?因为您没有分配到缓存,而是在更改字典本身缓存仍然指向字典,因此其本身没有改变。行cache['foo']='bar'转换为cache.\uuu setitem\uuuu('foo','bar')。换句话说,cache的值是pythondict,该值本身是可变的 如果您试图通过使用cache='bar'来更改cac

输出

cache = {}
def func():
    cache['foo'] = 'bar'
print cache['foo'] 
为什么这样做?为什么不需要使用
全局
关键字?

因为您没有分配到
缓存
,而是在更改字典本身<代码>缓存仍然指向字典,因此其本身没有改变。行
cache['foo']='bar'
转换为
cache.\uuu setitem\uuuu('foo','bar')
。换句话说,
cache
的值是python
dict
,该值本身是可变的

如果您试图通过使用
cache='bar'
来更改
cache
引用的内容,您将更改
cache
指向的内容,然后需要
global
关键字


也许我对一个类似问题的老回答有助于你理解其中的区别:.

全局
对于可变对象不是必需的。@AshwiniChaudhary想添加引用吗?@AshwiniChaudhary这完全是错误的。用列表试试看,它不起作用,列表和可变的!mylist=[]定义f1():mylist=['a'];如果在f1()@samsamara之外打印mylist,它仍然是空的,这不是我的意思,使用
mylist=['a']
可以显式定义一个新的局部变量。改为执行一个变异,比如
mylist.append(10)
etcYes如果你这样做了一个变异,它会起作用,因为你只需要访问它。但是如果我将函数更改为接受列表作为参数,
def f1(mylist):mylist=mylist+['a']
;在这里,我使用赋值运算符对列表进行变异。我有
mylist=['s']
,我调用
f1(mylist)
。现在,由于列表是可变的,您将list对象传递给
f1()
,但它仍然没有变化
mylist
。因此,通过这种方式,您可以无视使用
global
关键字的全部意义?@bunnyrabit:使用
global
关键字的意义在于让python编译器知道要更改的结构。要完全理解为什么需要这样做,需要深入研究Python的内部工作机制(
locals()
globals()
和字节码等等)。这里没有什么可以违抗的,动态语言并不是试图阻止您修改全局变量。:-)
bar