ITPub博客

首页 > 数据库 > 数据库开发技术 > python作用域

python作用域

原创 数据库开发技术 作者:Tim在路上 时间:2019-05-22 12:43:55 0 删除 编辑


块级作用域??

 1if 1 == 1:
2    name = "lzl"
3
4print(name)
5
6
7for i in range(10):
8    age = i
9
10print(age)
11lzl
129

java中是不可以执行成功的但是在python中可以执行成功,,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;

函数局部作用域

1def  func():
2    name = "zxt"
3
4print(name)
5
6name 'name' is not defined

name变量只在func()函数内部中生效,所以在全局中是没法调用的;

作用域误区

 1name = "lzl"
2
3def f1():
4    print(name)
5
6def f2():
7    name = "eric"
8    f1()
9
10f2()
11lzl

我们都知道,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
类似于下面的规则

 1#作用域链
2
3name = "lzl"
4def f1():
5    name = "Eric"
6    def f2():
7        name = "Snor"
8        print(name)
9    f2()
10f1()

我们再看一个代码

 1name = "lzl"
2
3def f1():
4    print(name)
5
6def f2():
7    name = "eric"
8    return f1
9
10ret = f2()
11ret()
12lzl

f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系.

静态作用域

1i = 1
2
3def g():
4    a = i
5    a = a + 3
6    print(i,a)
7
8g()
91

发现i可以找到全局变量
但是

1i = 1
2
3def g():
4    i = i + 1
5    a = a + 3
6    print(i,a)
7
8g()
9local variable 'i' referenced before assignment

无法找到全局的i,原因是Python是静态作用域(词法作用域),因此在编译阶段,就决定了变量的读取方式。



原文作者:Tim在路上;如有侵权,请联系管理员删除。

上一篇: Spring装配Bean
下一篇: Hbase原理与架构
请登录后发表评论 登录
全部评论

注册时间:2019-05-11

  • 博文量
    139
  • 访问量
    74560