活动地址:CSDN21天学习挑战赛
Python中控制块声明变量在块外被使用
笔者学习的第一门编程语言是
C
,这是一门静态编译型语言。后来接触了Python。Python简单易学,属于动态语言。所以,由于第一语言的影响,很多时候,自己编写代码时,思维会偏向于静态语言。这里说一下作用域的问题,主要讲
Python
和
C
的差异。对于Python初学者,也可以了解一下。
先从一个例子入手,看看你如何回答下面这个问题。
a = 0
if a == 0 :
b = 1
print(b)
请你回答一下,上面这段代码的结果是什么?或者具体一点,回答一下,上面的代码是否能够正常运行?
首先说一下结果:这段代码是能够正常运行的。
如果你回答会报错,变量b没有声明
,那么可能你和笔者犯了同样的错误。
Python是一门动态语言
对于大多数静态语言,其变量检查都是在编译阶段完成
。Python属于动态语言,它并不会在编译阶段去检查变量,而是运行时
检查变量。也就是说,对于Python,变量是否声明或者定义过,需要运行到该变量的使用处时,才能够判别。
此外,在C
语言中,声明一个整形变量使用语句int a
,对其初始化a = 0
。而在Python中,声明变量是隐式的
,所谓隐式就是不用你自己去声明变量,只需要管变量赋值就够了。
隐式声明是在你第一次使用某个未曾出现的变量(标识符)时,由解释器自动执行的。
所以Python
中声明和初始化是同时进行的
。
控制块的块级作用域不存在
Python变量在其出现的函数
(类
或模块
)范围内都是可以被使用的。
对于像for
,if
,while
,with
等这样的控制块,在其中声明的变量作用域能够延伸到当前控制块之外。(就好像这个控制块的作用域限制不存在一样)
几个例子加深理解
对于这个小的语言特性,笔者没有搜到权威的解释。所以就给几个例子加深理解,同时会用就行。
好了,上面给出的代码还有一些变种。来看看吧。
a = 1
if a == 0 :
b = 1
print(b)
现在再来回答一下结果吧。注意这段代码与最初给出的代码的区别。
首先,还是结果:运行失败,抛出异常。
NameError: name 'b' is not defined
为什么呢?主要是这里的if
语句,a==0
结果为False
,不会执行b=1
这条语句,那么也就不会声明并初始化变量b
。
来试试其他的控制块
-
for
-
for i in range(5): pass print(i)
-
结果为
4
,所以,for
循环的控制块中声明的变量也可以在块外使用
-
-
while
-
while True : i = 0 if i ==0 : break print(i)
-
结果为
0
。
-
参考资料
-
Scope of the variable initialised in the if statement - StudytonightScope of the variable initialised in the if statement - Studytonight
-
https://stackoverflow.com/questions/2829528/whats-the-scope-of-a-variable-initialized-in-an-if-statement