Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 全局变量以及需要声明它们的时间_Python_Scope_Global - Fatal编程技术网

Python 全局变量以及需要声明它们的时间

Python 全局变量以及需要声明它们的时间,python,scope,global,Python,Scope,Global,在以下代码中: >>> import time >>> cache = {} >>> >>> def squared(num): ... if num in cache: return cache[num] ... print ("Calculating...") ... time.sleep(1) # fake a calculation ... result = num * num ..

在以下代码中:

>>> 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}

为什么我可以在函数中修改
缓存
,而不必在函数中调用
全局
global
是否与变量是否可变或不可变直接相关,或者在上述情况下它为什么工作?

您的函数会看到外部缓存变量。 因为它是可变的,所以它可以对它进行变异,并且可以在函数内部和外部看到它

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

这里有一个提示:如果将
cache[num]=result
替换为
cache={num:result}
,你会得到一个.global与mutabilityok无关,所以基本上如果对象是不可变的,你需要使用
global
关键字在全局范围内更改它,对吗?如果它是可变的,你可以在任何地方更改它,而不用担心它。@Kyle不,你永远不能更改不可变的对象。这是不变的means@kyle,我认为你是在耦合两个独立的问题。可变/不可变和名称范围。前者讨论更改对象(值)的能力,后者讨论在什么范围内更改某个变量名(而不是值)的绑定。