Python 中作用域与命名空间的问题?

下面这个程序的答案怎么是1,不是2,请哪位大神解释下:
i= 1

def g():
print(i)

def f():
i= 2
g()

f() 
执行结果: 1

i=2 这一句 是定义了一个局部变量i, 并赋值为2;  这个时候全局作用域的i会被屏蔽, 所以全局变量i是没有被修改的 所以结果是1;


访问全局变量时可以直接访问, 但是修改全局作用域的时候一定要在赋值之前,进行如下声明:

def f():

    global i


    i = 2


因为python里赋值语句和声明变量是一个体的, 所以需要global来告诉解释器i是全局变量, 接下来的i=2才能被当作是赋值

------------------追答---------------------

同一个代码块(作用域)里, 同一个变量的作用域只能是同一种或者说同一个变量只能来自同一个作用域, 不能是一会是局部变量然后又变成全局变量;

i = i + 1

首先前面的'i='表明了i是一个局部变量(没有global声明, 创建局部变量), 然后后面的'i+1'里的i自然也是局部变量(同一个函数下同一个变量,i已经是局部变量了, 不能再当作全局变量去用), 那么自然会报错, i在使用前未声明

i += 1

报错就更明显了, 没有global声明 那么再修改变量i的时候, 自然是当作局部变量, 使用前未声明

变量的查找顺序遵循 LEGB 可以自己百度 

关于作用域给你再写个简单的示例, 你对照着理解一下

追问

非常感谢您的解惑,我还有一个问题向您请教:
在函数g()中,print(i)此时变量i取全局变量i中的值1,但是如果在print(i)前添加语句i=i+1,此时执行会报错:局部变量i没有被定义。我的疑问是:为什么执行i+=1时,局部变量i不会取全局变量i的值1来进行i+=1的操作,而是直接报局部变量i没有被定义的异常。
def g():
print(i)

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网