专栏名称: 爬虫俱乐部
Stata技术控,编程技术咨询,数据讨论与分享,编程和实证培训。
目录
51好读  ›  专栏  ›  爬虫俱乐部

每一个变量都会过好它们的一生

爬虫俱乐部  · 公众号  ·  · 2018-06-12 09:24

正文

请到「今天看啥」查看全文


为同一变量,此时就可以实现计数累加的效果。

nonlocal关键字

除了global,还有没有神奇的关键词用以实现某些必须跨越变量作用域的功能呢?那就是 nonlocal ,nonlocal表示申明此处为一个 闭合的作用域中的变量 ,现在我们将问题变得复杂一点,来看一看以下这段代码

def scope_test():
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal_spam"
    def do_global():
        global spam
        spam = "global_spam"

    spam = "test_spam"
    do_nonlocal()
    print("After_nonlocal_assignment:", spam)
    do_global()
    print("After_global_assignment:", spam)


scope_test()
print("In_global_scope:", spam)

这个写法有些奇怪,我们首先定义了一个函数 scope_test() ,紧接着在该函数内定义两个函数 do_nonlocal do_global ,这并不会引发语法错误,在函数体内执行函数定义,这在python中是合法的,它与平级定义若干个函数这个方法在功能上大部分一样,但是在 变量作用 域上则会有 区别

它的运行结果是

After_nonlocal_assignment: nonlocal_spam
 After_global_assignment: nonlocal_spam
 In_global_scope: global_spam

这是因为, nonlocal spam 成功申明到了函数scope_test内的spam变量,原因是spam变量处于scope_test函数内,是在一个 闭合作用域内 的变量。而 global 未申明到spam变量,而是直接在函数体外创造了一个全局变量spam,原因是global用于申明 全局变量 ,与scope_test函数内的spam不一致。所以我们看到了,在第二行结果中,未申明成功, spam 的内容依旧是上一次的 nonlocal_spam ,而在全局范围内的输出成功了。

函数的参数列表传递

在看完了上面的两个关键字后,我们在本文的最后讨论一个问题,也是python的初学者们经常感到困惑的一个问题,也就是函数的参数列表传递,请看下面一段代码

def getlist(alist = []):
    alist.append('a')
    return alist

def getint(a = 10):
    a = a + 10
    return a

print(getint())
print(getint())
print(getint(5))
print(getint(1))

print(getlist())
print(getlist())
print(getlist())
print(getlist())

这里我们定义了两个函数,一个是 getint 用以取得变量 a ,一个是 getlist 用以取得列表 alist 。它们的运行结果可能会出乎你的意料

 20
20
15
11
['a'






请到「今天看啥」查看全文