Why is the global keyword not required in this case?
1 2 3 4
| cache = {}
def func():
cache['foo'] = 'bar'
print cache['foo'] |
输出
号
为什么这样做有效?为什么不需要使用global关键字?
- 可变对象不需要global。
- @Ashwinichaudhary是否要添加引用?
- @阿什维尼查德哈雷,那完全是不真实的。用一个列表试试这个,它不会起作用,列表和可变的!mylist=[]def f1():mylist=['a'];如果在f1()之外打印,mylist仍为空
- @Samsamara,这不是我的意思,使用mylist = ['a'],您显式地定义了一个新的局部变量。执行突变,如mylist.append(10)等
- 是的,如果你做了这样的变异,它会起作用,因为你只能访问它。但是假设我改变函数接受一个列表作为参数,def f1(mylist): mylist = mylist + ['a'];在这里我使用赋值操作符改变列表。我叫mylist = ['s'],我叫f1(mylist)。现在,由于列表是可变的,并且您将列表对象传递给f1(),但是它仍然没有改变mylist。
- 因此,我想更好的方法是根据是否/如何在带有参数的函数中使用赋值运算符进行思考。
- @Samsamara mylist = mylist + ['a']不是一个突变,它产生了一个全新的列表。
因为您没有给cache赋值,所以您改为更改字典本身。cache仍然指向字典,因此它本身是不变的。行cache['foo'] = 'bar'翻译为cache.__setitem__('foo', 'bar')。换句话说,EDOCX1的值(0)是一个python dict,这个值本身是可变的。
如果您试图通过使用cache = 'bar'来更改cache所指的内容,那么您将更改cache所指的内容,然后需要global关键字。
也许我对类似问题的这个老答案可以帮助您理解区别:python列表并不反映变量的变化。
- 这样一来,人们就可以无视拥有global关键字的全部意义了?
- @bunnyrabit:拥有global关键字的关键是让Python编译器知道要更改什么结构。完全理解为什么需要这样做需要深入研究python的内部工作(locals()与globals()以及字节代码等)。这里没有定义任何东西,动态语言并不是为了阻止你修改全局。-)