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

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%;" />
1因为使用 3 来调用 foo,会打印出 {'arg': 3, 'x': 1}。这个应该没什么奇怪的。
2locals 是一个返回 dictionary 的函数,这里您在 dictionary 中设置了一个值。您可能认为这样会改变局部变量x 的值为 2,但并不会。locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
3这样会打印出 x= 1,而不是 x= 2
4在有了对 locals 的经验之后,您可能认为这样不会 改变 z 的值,但是可以。由于 Python 在实现过程中内部有所区别 (关于这些区别我宁可不去研究,因为我自已还没有完全理解) ,globals 返回实际的全局名字空间,而不是一个拷贝:与 locals 的行为完全相反。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。
5这样会打印出 z= 8,而不是 z= 7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值