为了账号安全,请及时绑定邮箱和手机立即绑定

Python非本地语句

Python非本地语句

蝴蝶不菲 2019-08-09 11:15:50
Python非本地语句Python nonlocal语句做了什么(在Python 3.0及更高版本中)?官方Python网站上没有文档,help("nonlocal")也没有用。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

比较这个,不使用nonlocal

x = 0def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)outer()print("global:", x)# inner: 2# outer: 1# global: 0

对此,使用nonlocal,其中inner()x现在也是outer()x

x = 0def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)outer()print("global:", x)# inner: 2# outer: 2# global: 0

如果我们要使用global它,它将绑定x到正确的“全局”值:

x = 0def outer():
    x = 1
    def inner():
        global x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)outer()print("global:", x)# inner: 2# outer: 1# global: 2


查看完整回答
反对 回复 2019-08-09
?
Qyouu

TA贡献1786条经验 获得超11个赞

简而言之,它允许您为外部(但非全局)范围内的变量赋值。有关所有血腥细节,请参阅PEP 3104


查看完整回答
反对 回复 2019-08-09
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

谷歌搜索“python nonlocal”出现了Proposal,PEP 3104,它完整地描述了该声明背后的语法和推理。简而言之,它的工作方式与global语句完全相同,只是它用于引用既不是全局也不是函数本地的变量。

以下是您可以使用此功能的简要示例。可以重写计数器生成器以使用它,使其看起来更像是带闭包的语言的习语。

def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count    return counter

显然,你可以把它写成一个生成器,如:

def counter_generator():
    count = 0
    while True:
        count += 1
        yield count

不过,虽然这是完全地道的蟒蛇,它似乎是第一个版本将是初学者更明显一点。通过调用返回的函数正确使用生成器是一个常见的混淆点。第一个版本显式返回一个函数。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信