首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python入门教程(七)

当我们开始编写一个程序时,设定的变量就默认为是全局变量。

局部变量:当我们定义一个函数模块时,模块里的内容就是局部变量。

局部变量运行完毕之后,就会被销毁。同理,当一个程序运行完毕之后,程序里的变量也会被销毁。

它们之间的关系:

局部变量可以引用全局变量中的内容

全局变量不可以引用局部变量中的内容

一个局部变量不能使用另外一个局部变量中的内容

如果在不同的作用域中,你可以用相同的名字去命名不同的变量。也就是说可以使用一个名为change的全局变量和一个名为change的局部变量。

局部变量可以引用全局变量中的内容

程序为:

def spam():

print(eggs)

eggs = 42

spam()

print(eggs)

运行结果为:

42

42

定义的函数在刚被定义时并不执行,所以代码从eggs=42处开始执行,由于局部作用域中没有eggs变量,则局部作用域调用全局变量中的eggs=42,因此执行spam()后的结果是打印42,再执行print(eggs)的结果也是打印出42.

全局变量不可以引用局部变量中的内容

程序为:

def spam():

eggs=31337

spam()

print(eggs)

运行结果为:

Traceback (most recent call last):

File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 4, in

print(eggs)

NameError: name 'eggs' is not defined

spam()函数在被调用时给eggs赋值为31337,调用完成后,eggs变量被销毁。所以print(eggs)处会出现变量未被定义的情况。

一个局部变量不能使用另外一个局部变量中的内容

程序为:

def spam():

eggs = 99

bacon()

print(eggs)

def bacon():

ham = 101

eggs = 0

spam()

运行之后的结果是:99

调用spam()函数时执行eggs=99,然后调用bacon()函数,虽然其中为eggs赋值为0,但是bacon()函数调用结束时,eggs变量被销毁,所以print(eggs)只能打印出99。

名称相同的局部变量和全局变量。

【一般不提倡这种做法,不方便检查和使用。】

程序为:

def spam():

eggs='spam local'

print(eggs)#prints 'spam local'

def bacon():

eggs='bacon local'

print(eggs)#prints 'bacon local'

spam()

print(eggs)#printd 'bacon local'

eggs='global'

bacon()

print(eggs)

程序的执行结果为:

bacon local

spam local

bacon local

global

在这个程序中,有三个名为eggs的变量,分别位于spam()、bacon()、和全局变量中。虽然名字相同,执行时可以正常执行,因为每个局部变量执行完毕之后就会被 销毁,所以下个局部变量,甚至全局变量使用与之前局部变量相同的变量名称也无所谓。

global语句

在我们定义了一个函数之后,函数所处的局部作用域内,出现的变量是局部变量。但如果我们希望在定义函数的时候,设置的变量就能修改全局作用域中的内容,就可以在变量前加上global语句。如:

def spam():

global eggs

eggs='spam'

eggs = 'global'

spam()

print(eggs)

程序执行结果为spam

回过头来,让我们看一下程序。首先eggs被赋值为‘global’,然后调用spam()函数,这时函数内部定义的函数并没有在返回时被销毁,因为为它加了global语句,变成了全局变量,所以调用函数的结果为eggs再次被赋值为‘spam’覆盖了之前的‘global’,因此被打印出‘spam’。

4条法则来区分一个变量是局部作用域还是全局作用域

1)如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。

2)如果在一个函数中,有针对该变量的global语句,它就是全局变量。

3)否则,如果该变量用于函数的赋值语句,它就是局部变量。

4)但是,如果该变量没有用在赋值语句中,它就是全局变量。

举例:

def spam():

global eggs

eggs='spam'#这是一个全局变量

def bacon():

eggs='bacon'#这是一个局部变量

def ham():

print(eggs)#这是一个全局变量

eggs=42#这是一个全局变量

spam()

priint(eggs)

在一个函数中,一个变量要么总是局部变量,要么总是全局变量。函数中的代码没有办法先使用名为eggs的局部变量,稍后又在同一个函数中使用eggs的全局变量。如:

def spam():

print(eggs)

eggs ='spam local'

eggs = 'global'

spam()

函数运行的结果如下,会报错。

Traceback (most recent call last):

File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 5, in

spam()

File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/2.py", line 2, in spam

print(eggs)

UnboundLocalError: local variable 'eggs' referenced before assignment

因为在函数内部有关于eggs的赋值,Python就认为eggs是局部变量,但print(eggs)位于变量赋值之前,eggs还未赋值,但又不能向下使用全局变量中eggs的赋值,所以就会被报错。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180204G0Z1CK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券