python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 。

一 global

global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。

 gcount = 0

 def global_test():
gcount+=1
print (gcount)
global_test()

D:\Python34\python.exe E:/PycharmProjects/Day3/globaltest.py
Traceback (most recent call last):
File "E:/PycharmProjects/Day3/globaltest.py", line 6, in <module>
global_test()
File "E:/PycharmProjects/Day3/globaltest.py", line 4, in global_test
gcount+=1
UnboundLocalError: local variable 'gcount' referenced before assignment

Process finished with exit code 1

第一行定义了一个全局变量,(可以省略global关键字)。

在global_test 函数中程序会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错。

二、声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量:

gcount = 0

def global_test():
global gcount
gcount+=1
print (gcount)
global_test()

  如果在函数中声明 gcount 是全局变量,即可对其进行修改。 正确输出 1 。

三、 在局部如果不声明全局变量,并且不修改全局变量。则可以正常使用全局变量:

gcount = 0

def global_test():
print (gcount)
global_test()

  如果在局部不修改全局变量,程序正确输出 0 。

四、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。

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

  输出:

1

2

3

五、

def scope_test():
def do_local():
spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错
def do_nonlocal():
nonlocal spam #使用外层的spam变量
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignmane:", spam)
do_nonlocal()
print("After nonlocal assignment:",spam)
do_global()
print("After global assignment:",spam) scope_test()
print("In global scope:",spam)

  输出是:

After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

在函数 add_b 内 global 定义的变量 b,只能在 函数 do_global 内引用, 如果要在 do_global 内修改,必须在 do_global 函数里面声明 global  b ,表明是修改外面的 全局变量 b :

def add_b():
global b
b =
def do_global():
global b
b = b +
print(b)
do_global()
print(b)
add_b()

global 定义的变量,表明其作用域在局部以外,即局部函数执行完之后,不销毁 函数内部以global定义的变量:

def add_a():
global a
a =
add_a()
print(a)

输出 3 。

def add_b():
global b
b =
def do_global():
global b
b = b +
print(b)
do_global()
print(b)
add_b()
print(b)

以上代码输出:

52

52

52

def add_b():
global b
b =
def do_global():
#global b
b = b +
print(b)
do_global()
print(b)
add_b()

以上代码报错:

Traceback (most recent call last):
File "E:/PycharmProjects/OOP/exe1.py", line 42, in <module>
add_b()
File "E:/PycharmProjects/OOP/exe1.py", line 40, in add_b
do_global()
File "E:/PycharmProjects/OOP/exe1.py", line 38, in do_global
b = b + 10
UnboundLocalError: local variable 'b' referenced before assignment

原因: global 定义的 b ,只能引用,不能修改。

def add_b():
global b
b =
def do_global():
global a
a = b +
print(b)
do_global()
print(a)
add_b()
print("a = %s , b = %s " %(a, b))

输出:

42
52
a = 52 , b = 42

def add_b():
#global b
b =
def do_global():
global b
b =
print(b)
do_global()
print(b)
add_b()
print(" b = %s " % b)

以上代码输出:

10
42
b = 10

def add_b():
#global b
b =
def do_global():
nonlocal b
b =
print(b)
do_global()
print(b)
add_b()

以上代码输出:

10

10

def add_b():
#global b
b = 42
def do_global():
nonlocal b
b = 10
print(b)
do_global()
print(b)
add_b()
print(" b = %s " % b)

  以上代码报错:

print(" b = %s " % b)
NameError: name 'b' is not defined

说明: nonlocal  适用于在局部函数 中 的局部函数, 把最内层的局部 变量设置成外层局部可用,但是还不是全局的。

def add_b():
#global b
#b =
def do_global():
nonlocal b
b =
print(b)
do_global()
#print(b)
add_b()

以上代码报错:

File "E:/PycharmProjects/OOP/exe1.py", line 37
nonlocal b
SyntaxError: no binding for nonlocal 'b' found

nonlocal 要绑定一个局部变量。

def add_b():
#global b
#b = 42
def do_global():
global b
b = 10
print(b)
do_global()
print(b)
add_b()
print(" b = %s " % b)

以上代码输出:

10
10
b = 10

def add_b():
#global b
#b = 42
def do_global():
global b
b = 10
print(b)
do_global()
#b = b + 20
print(b)
add_b()
b = b + 30
print(" b = %s " % b)

以上代码输出:

10
10
b = 40

def add_b():
#global b
#b = 42
def do_global():
global b
b = 10
print(b)
do_global()
b = b + 20
print(b)
add_b()
b = b + 30
print(" b = %s " % b)

以上代码报错:

b = b + 20
UnboundLocalError: local variable 'b' referenced before assignment

def add_b():
#global b
b = 42
def do_global():
global b
b = 10
print(b)
do_global()
b = b + 5
print(b)
add_b()
b = b + 30
print(" b = %s " % b)

以上代码输出:

10
47
b = 40

最新文章

  1. Delphi中滚动文字的应用
  2. JavaScrip的DOM操作(13号讲)
  3. iOS弹框
  4. Nginx-/etc/sysctl.conf 参数解释
  5. InAction-MR的topK
  6. UITableViewCell 左滑删除
  7. scala 入门(1)
  8. jquery与ajax的应用
  9. HDU 2962 Trucking
  10. asp.net 检查文件夹和文件是否存在
  11. Javascript技巧实例精选(1)—鼠标选择动态改变网页背景颜色
  12. Java通过链表实现队列
  13. Mtcnn进行人脸剪裁和对齐
  14. 学习笔记—log4j2
  15. Pascal语言(存档)
  16. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
  17. rest_framework_api规范
  18. 20145325张梓靖 《Java程序设计》第9周学习总结
  19. 腾讯视频qlv格式转换MP4普通视频方法
  20. std::nothrow

热门文章

  1. Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏
  2. CSS调试小技巧 —— 调试DOM元素hover,focus,actived的样式
  3. 实战JS正则表达式
  4. Emacs 配置文件
  5. sublime text2 安装less2css插件
  6. 玩转动态编译 - 高级篇:一,IL访问静态属性和字段
  7. mysql 截取身份证出生日期
  8. Google Chrome调试js入门
  9. Android-Notification-简单的demo
  10. highchart导出图片