【问题标题】:Globals and when they need to be declared全局变量以及何时需要声明
【发布时间】:2019-10-20 00:08:14
【问题描述】:

在以下代码中:

>>> import time
>>> cache = {}
>>> 
>>> def squared(num):
...     if num in cache: return cache[num]
...     print ("Calculating...")
...     time.sleep(1) # fake a calculation
...     result = num * num
...     cache[num] = result
...     return result
... 
>>> squared(2)
Calculating...
4
>>> squared(2)
4
>>> cache
{2: 4}

为什么我可以在函数中修改cache,而不必在函数中调用globalglobal 是否与变量是否可变/不可变直接相关,或者为什么它在上述情况下起作用?

【问题讨论】:

  • 这里有一个提示:如果你用cache = {num: result}替换cache[num] = result,你会得到一个UnboundLocalError
  • global 与可变性无关

标签: python scope global


【解决方案1】:

您的函数会看到外部缓存变量。 因为它是可变的,所以它可以改变它,它可以在函数内部和函数外部看到。

如果要为名称分配新值并且还希望外部名称绑定到该值,则需要使用 global。 例如,如果您想将 3 分配给名称“cache”,则使用 cache =3。如果您不将其声明为全局,它将是函数内部的一个简单局部变量,并且外部缓存名称仍将绑定到其原始值。

【讨论】:

  • 好的,所以基本上如果对象是不可变的,您需要使用global 关键字在全局范围内更改它,对吗?如果它是可变的,您可以在任何地方更改它而不必担心。
  • @Kyle no 您可以永远更改不可变对象。这就是不可变的意思
  • @kyle,我认为您正在耦合两个独立且独立的问题。可变/不可变和名称范围。前者讲的是改变一个Object(值)的能力,后者是在什么范围内改变某个变量名(不是值)的绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2011-08-16
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多