设为首页 收藏本站
查看: 1181|回复: 0

[经验分享] 零基础学python-16.2 作用域法则

[复制链接]

尚未签到

发表于 2017-5-6 13:45:08 | 显示全部楼层 |阅读模式
  作用域法则:
  1.模块中定义的顶级变量,作用域是整个模块

def test():
print(id(x))
print(x)
def test2():
print(x)
if __name__=='__main__':
x=100000
test()
test2()
  

我们把上面的代码保存为test.py
DSC0000.jpg

  在上面的代码里面,我们定义了一个在模块里面通用的变量x,他是整个模块都可以使用的,就像test2引用x
  然而,我们把上面的代码修改成下面的样子:

def test():
print(id(x))
print(x)
y=1
print(y)
def test2():
print(x)
if __name__=='__main__':
x=100000
test()
test2()
print(y)
  

输出:

>>> ================================ RESTART ================================
>>>
20144208
100000
1
100000
Traceback (most recent call last):
File "C:\Python34\test.py", line 12, in <module>
print(y)
NameError: name 'y' is not defined
>>>
  

异常提示找不到y,因为y的作用域只在test1里面,离开了test1,y就不存在了
  我们再引用两个例子来说明:
  模块test1.py

def test():
print(id(x))
print(x)
y=1
print(y)
def test2():
print(x)
if __name__=='__main__':
x=100000
test()
test2()

  模块test2.py

def test():
pass
def test2():
pass
if __name__=='__main__':
try:
print(x)
except:print('x is not exit')
x='abc'
print(id(x))

  

我们第一次先运行test1.py,然后打印x和id(x)出来

>>> ================================ RESTART ================================
>>>
20144208
100000
1
100000
>>> x
100000
>>> id(x)
20144208
  

这个时候在idle里面可以引用x
  同时我们运行test2.py

>>> ================================ RESTART ================================
>>>
x is not exit
12231040
>>> x
'abc'
>>> id(x)
12231040
>>>
  

这个时候x出现异常,然后x跟着就指向不同的对象
  从上面的实验可以看出,变量x在不同模块之间是不能够互相调用,作用域只存在与模块里面
  2.每次对函数的调用都创建一个新的本地作用域
  我们把下面的代码保存为test.py

def test():
print(id(x))
print(x)
if __name__=='__main__':
x='e f t efdad'
test()

  

然后在idle里面运行

>>> ================================ RESTART ================================
>>>
31843176
e f t efdad
>>> ================================ RESTART ================================
>>>
31843136
e f t efdad
>>>
  

两次输出的结果id都不一样,也就是引用变了,内存地址变了,其实调用的时候是引用一个新的命名空间
  3.赋值的变量除非是命名为全局变量或非本地变了,否则均为本地变量

def test():
global x
y=3
def test2():
print(y)
x=2
z=1
a='a'
b='b'
if __name__=='__main__':
x='e f t efdad'
test()
  

  上面的代码,x是全局变量,y是非本地变量,其他的z、a、b都是本地变量

>>> x
2
>>> y
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
y
NameError: name 'y' is not defined
>>> a
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
a
NameError: name 'a' is not defined
b
>>> c
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
c
NameError: name 'c' is not defined
>>> z
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
z
NameError: name 'z' is not defined
>>>
  

运行完之后我们再在idle里面输出x,y,z,a,b,c只有x存在,其他都不存在
  4.所有变量名都可以归纳为本地、内置或者全局的
  总结:我们这一章节简单说明了作用域的法则
这一章节就说到这里,谢谢大家

------------------------------------------------------------------
点击跳转零基础学python-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373886-1-1.html 上篇帖子: Google推出Java/Python加密工具包KeyCzar 下篇帖子: 零基础学python-18.9 序列映射函数:map
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表