您的位置:首页 > 编程语言 > Python开发

python locals 与 globals 之间有另外一个重要的区别

2015-09-22 11:20 549 查看
locals 与 globals 之间有另外一个重要的区别,您应该在它困扰您之前就了解它。它无论如何都会困扰您的,但至少您还会记得曾经学习过它。

例 8.12. locals 是只读的,globals 不是

<span class="pykeyword">
def</span> foo(arg):
x = 1
<span class="pykeyword">print</span> locals()    <a target=_blank name="dialect.locals.4.1" style="color: rgb(51, 102, 153);"></a><img border="0" alt="1" src="http://woodpecker.org.cn/diveintopython/images/callouts/1.png" width="12" height="12" style="border: none; max-width: 100%;" />
locals()[<span class="pystring">"x"</span>] = 2 <a target=_blank name="dialect.locals.4.2" style="color: rgb(51, 102, 153);"></a><img border="0" alt="2" src="http://woodpecker.org.cn/diveintopython/images/callouts/2.png" width="12" height="12" style="border: none; max-width: 100%;" />
<span class="pykeyword">print</span> <span class="pystring">"x="</span>,x      <a target=_blank name="dialect.locals.4.3" style="color: rgb(51, 102, 153);"></a><img border="0" alt="3" src="http://woodpecker.org.cn/diveintopython/images/callouts/3.png" width="12" height="12" style="border: none; max-width: 100%;" />

z = 7
<span class="pykeyword">print</span> <span class="pystring">"z="</span>,z
foo(3)
globals()[<span class="pystring">"z"</span>] = 8    <a target=_blank name="dialect.locals.4.4" style="color: rgb(51, 102, 153);"></a><img border="0" alt="4" src="http://woodpecker.org.cn/diveintopython/images/callouts/4.png" width="12" height="12" style="border: none; max-width: 100%;" /><span class="pykeyword">
print</span> <span class="pystring">"z="</span>,z          <a target=_blank name="dialect.locals.4.5" style="color: rgb(51, 102, 153);"></a><img border="0" alt="5" src="http://woodpecker.org.cn/diveintopython/images/callouts/5.png" width="12" height="12" style="border: none; max-width: 100%;" />




因为使用 3 来调用 foo,会打印出 {'arg': 3, 'x': 1}。这个应该没什么奇怪的。


locals 是一个返回 dictionary 的函数,这里您在 dictionary 中设置了一个值。您可能认为这样会改变局部变量x 的值为 2,但并不会。locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。


这样会打印出 x= 1,而不是 x= 2。


在有了对 locals 的经验之后,您可能认为这样不会 改变 z 的值,但是可以。由于 Python 在实现过程中内部有所区别 (关于这些区别我宁可不去研究,因为我自已还没有完全理解) ,globals 返回实际的全局名字空间,而不是一个拷贝:与 locals 的行为完全相反。所以对 globals 所返回的
dictionary 的任何的改动都会直接影响到全局变量。


这样会打印出 z= 8,而不是 z= 7。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: