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()

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

结束。

猜你喜欢

转载自www.cnblogs.com/liusingbon/p/13204195.html