• Python字典_循环_全局变量


    一,字典与循环

    如果你在 for 语句里面用字典,程序会遍历字典中的所有键。例如下面这个 print_hist 函数就输出其中的每一个键与对应的键值:

    $ cat c.py

    #!/bin/python

    def histogram(s):

        d = dict()

        for c in s:

            if c not in d:

               d[c] = 1

            else:

               d[c] += 1

        return d

    def print_hist(h):

        for c in h:

            print(c, h[c])

    h = histogram('apple')

    print(print_hist(h))

    执行结果:

    $ python3 c.py

    a 1

    p 2

    l 1

    e 1

    None

    二,全局变量

    在主函数中的变量也叫全局变量,因为所有函数都可以访问这些变量。局部变量在所属的函数结束后就消失了,而主函数在其他函数调用结束后依然还存在。

    一般常用全局变量作为 flag(标识);比如用来判断一个条件是否成立的布尔变量之类的。比如有的程序用名字为 verbose 的标识变量,来控制输出内容的详细程度:

    $ cat d.py

    #!/bin/python

    verbose = True

    def example1():

        if verbose:

            print('Running example1')

    如果你想给全局变量重新赋值,可以看看下面这个例子:

    这几行代码的意图,本来是想要追踪确定函数是否被调用了:

    $ cat d.py

    #!/bin/python 

    been_called = False

    def example2():

        been_called = True

    但运行后并不报错,been_called的值也并不会变化。

    这个情况的原因是 example2这个函数创建了一个新的名为been_called 的局部变量。函数结束之后,局部变量就释放了,并不会影响全局变量。所以,要在函数内部来给全局变量重新赋值,必须要在使用之前声明这个全局变量:

    $ cat d.py

    #!/bin/python 

    been_called = False

    def example2():

         global been_called      #全局申明

         been_called = True

    global 那句代码的效果是告诉解释器:【在这个函数内,been_called 是个全局变量;不要创建一个同名的局部变量】

    下面的例子中,试图对全局变量进行更新:

    $ cat d.py

    #!/bin/python 

    count = 0

    def example3():

        count += 1

    print(example3())

    执行后报错如下:

    UnboundLocalError: local variable 'count' referenced before assignment(意思是未绑定局部错误:局部变量 count 未经赋值就被引用

    Python 会假设这个 count 是局部的,然后基于这样的假设,就是在写出该变量之前就试图读取;这样问题的解决方法依然就是声称count 为全局变量:

    count = 0

    def example3():

         global count

         count += 1

    如果全局变量指向的是一个可修改的值,你可以无需声明该变量就直接修改:

    known = {0:0, 1:1}
    def example4():

          known[2] = 1

    所以你可以在全局的列表或者字典里面添加、删除或者替换元素;但如果你要重新给这个全局变量赋值,就必须要声明了:

    def example5():
          global known
          known = dict()

    虽然全局变量很有用,但不要总是修改全局变量的值,那样会增加调试的难度。

    结束。
  • 相关阅读:
    workerPool _ golang
    jsp:JDBCmysql数据库连接
    jsp:session的跟踪方式
    js:使用nodejs为页面传递mysql中的数据
    js:网页中的高和宽(document)
    js:nodejs简单的Http服务器搭建
    js:面向对象编程
    js:nextSibling兄弟节点的使用
    java:mysql基础语法
    jsp:常用标签的核心标签的使用
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13204195.html
Copyright © 2020-2023  润新知