类内部使用全局变量为什么不用声明为global?

2013-09-26 09:52:36 +08:00
 hhrmatata
N = 12

class Test(object):
def p(self):
print N + 1

t = Test()
t.p()

输出:
13

---------------------------------------
为什么不需要在"print N + 1"前面加上"global N"?
8067 次点击
所在节点    Python
9 条回复
wang2191195
2013-09-26 10:04:08 +08:00
READ是不需要的
你要N = 1 的话,才需要global N
messense
2013-09-26 10:06:56 +08:00
N = 12

class Test(object):
def p(self):
print N + 1
global M
M = 12

if __name__ == '__main__':
t = Test()
t.p()
print M

--------------------------
楼主运行下这个程序试试理解下。
187j3x1
2013-09-26 10:08:28 +08:00
引用不用声明全局 操作它就要了
qdcanyun
2013-09-26 10:08:43 +08:00
hhrmatata
2013-09-26 10:30:35 +08:00
@wang2191195
@187j3x1

好像是这样的,引用不用声明,操作需要声明.
非常感谢!
hhrmatata
2013-09-26 10:32:33 +08:00
@wang2191195
@187j3x1

不知道为什么要这样设计?有什么好处?
liwei
2013-09-26 10:38:15 +08:00
Golevka
2013-09-27 21:45:14 +08:00
@hhrmatata 不光类内引用全局变量不需要声明, 函数内也是一样. 因为在没有重名的局部变量时, 你用词法作用域规则总是能看到更外层的局部变量, 以及全局变量 (所以说局部变量和全局变量本质上没什么差别, 只不过人们喜欢在实现上加以区分而已).

至于改写要用global可以认为是一种保护规则. 毕竟python不像ML,perl,js之类的有var/let可以强制新的局部变量shadow下一层作用域的同名变量. 在没有这条规则的情况下, 如果别人写一个函数里面有n = 10, 同时你又在全局作用域定义了一个n, 于是你的n就莫名其妙地被改写了, 程序到此为止也就傻逼了. 这时你除了给n换一个别的名字之外没有别的办法——祝你不是项目快写完了才发现的这个问题.
kehr
2013-09-29 18:18:37 +08:00
程序在执行过程中对于变量的查找,先从局部命名空间开始,查找不到再向外查找全局命名空间。这也是python为什么在局部命名空间里可以引用全局命名空间变量的规则。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/83722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX