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在路上;如有侵权,请联系管理员删除。