python 变量只用一次_Python:为什么说只引用的变量是隐式全局的?

例子

(进一步了解摘要)

这意味着如果一个变量从未在函数体中赋值,那么它将被视为全局变量.

这解释了为什么以下工作(a被视为全局):

a = 1

def fn():

print a # This is "referencing a variable" == "reading its value"

# Prints: 1

但是,如果将变量赋值给函数体中的某个位置,则它将被视为整个函数体的局部变量.

这包括在分配之前找到的语句(请参阅下面的示例).

这解释了为什么以下不起作用.在这里,a被视为本地的,

a = 1

def fn():

print a

a = 2 # <<< We're adding this

fn()

# Throws: UnboundLocalError: local variable 'a' referenced before assignment

您可以让Python使用语句global a将变量视为全局变量.如果这样做,则变量将被视为全局变量,同样适用于整个函数体.

a = 1

def fn():

global a # <<< We're adding this

print a

a = 2

fn()

print a

# Prints: 1

# Then,prints: 2 (a changed in the global scope too)

摘要

与您可能期望的不同,如果无法在本地范围内找到,Python将不会回退到全局范围.

这意味着整个函数体的变量是局部变量或全局变量:它不能是全局的,然后变为局部变量.

现在,关于变量是被视为本地变量还是全局变量,Python遵循以下规则.变量是:

>全局如果仅引用且从未分配给

>全局如果使用全局声明

>如果变量至少分配一次(并且未使用全局变量),则为Local

进一步说明

事实上,“隐含全球化”并不意味着全球化.这是一个更好的思考方式:

>“local”表示“函数内部的某个地方”

>“全球”真的意味着“在功能之外的某个地方”

因此,如果变量是“隐式全局”(==“在函数外部”),那么它的“封闭范围”将首先被查找:

a = 25

def enclosing():

a = 2

def enclosed():

print a

enclosed()

enclosing()

# Prints 2,as supplied in the enclosing scope,instead of 25 (found in the global scope)

现在,像往常一样,global允许您引用全局范围.

a = 25

def enclosing():

a = 2

def enclosed():

global a # <<< We're adding this

print a

enclosed()

enclosing()

# Prints 25,as supplied in the global scope

现在,如果你需要分配一个封闭的,并希望在封闭的范围内改变一个值,而不是在全局范围内,那么你需要nonlocal,这在Python 3中是新的.在Python 2中,你可以’吨.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值