【问题标题】:Why is the global keyword not required in this case?为什么在这种情况下不需要 global 关键字?
【发布时间】:2012-12-29 11:44:29
【问题描述】:
cache = {}
def func():
    cache['foo'] = 'bar'
print cache['foo'] 

输出

bar

为什么这有效,为什么不需要使用 global 关键字?

【问题讨论】:

  • global 不是可变对象所必需的。
  • @AshwiniChaudhary 关心添加参考?
  • @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

标签: python global-variables


【解决方案1】:

因为您没有分配cache,所以您正在更改字典本身。 cache 仍然指向字典,因此它本身没有改变。行cache['foo'] = 'bar' 转换为cache.__setitem__('foo', 'bar')。换句话说,cache 的值是一个 python dict,并且该值本身是可变的。

如果您尝试使用 cache = 'bar' 来更改 cache 所指的内容,那么您将更改 cache 指向的内容,然后您需要 global 关键字。

也许我对类似问题的这个较早的回答可以帮助您理解差异:Python list doesn't reflect variable change

【讨论】:

  • 所以这样一来就可以无视拥有global关键字的全部意义吗?
  • @BunnyRabbit:拥有global 关键字的要点 是让python 编译器知道要更改什么结构。完全理解为什么需要这样做需要深入研究 Python 的内部工作原理(locals()globals() 和字节码等)。这里没有什么是违抗的,动态语言不是试图阻止你修改全局变量。 :-)
猜你喜欢
  • 2012-12-14
  • 2016-08-08
  • 2016-07-17
  • 1970-01-01
  • 2017-07-15
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多