Python变量访问范围

case1:

# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

class MemberCounter(object):
    members=-1
    def count(self):
        self.members+=1

if __name__ == "__main__":
    m1=MemberCounter()
    m1.count()
    print "m1.members is %d" %(m1.members)
    
    m2=MemberCounter()
    print "m2.members is %d" %(m2.members)
    
    m2.count()
    m2.count()
    print "m1.members is %d" %(m1.members)
    print "m2.members is %d" %(m2.members)
运行结果如下:



# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

class MemberCounter(object):
    members=-1
    def count(self):
        MemberCounter.members+=1

if __name__ == "__main__":
    m1=MemberCounter()
    m1.count()
    print "m1.members is %d" %(m1.members)
    
    m2=MemberCounter()
    print "m2.members is %d" %(m2.members)
    
    m2.count()
    m2.count()
    print "m1.members is %d" %(m1.members)
    print "m2.members is %d" %(m2.members)

运行结果如下:


# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

class MemberCounter(object):
    members=-1
    def count(self):
        MemberCounter.members+=1

if __name__ == "__main__":
    m1=MemberCounter()
    m1.count()
    print "m1.members is %d" %(m1.members)
    
    m2=MemberCounter()
    print "m2.members is %d" %(m2.members)
    
    m1.members=8
    m2.count()
    m2.count()
    print "m1.members is %d" %(m1.members)
    print "m2.members is %d" %(m2.members)

运行结果如下:



# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

class MemberCounter(object):
    members=-1
    def count(self):
        self.members+=1

if __name__ == "__main__":
    m1=MemberCounter()
    m1.count()
    print "m1.members is %d" %(m1.members)
    
    print MemberCounter.members

运行结果如下:



case2:

# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

num=100

class Test(object):
    
    def printNum(self):
        num=20
        print num
         

if __name__ == "__main__":
    test=Test()
    print num
    test.printNum()
    print num

运行结果如下:



# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

num=100

class Test(object):
    
    def printNum(self):
        global num
        num=20
        print num
         

if __name__ == "__main__":
    test=Test()
    print num
    test.printNum()
    print num
运行结果如下:


# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

num=100

class Test(object):
    
    def printNum(self):
        print num
         

if __name__ == "__main__":
    test=Test()
    print num
    test.printNum()
    
运行结果如下:


# -*- coding: utf-8 -*-
'''
Created on 2016年1月29日

@author: zhouzhou
'''

num=100

class Test(object):
    
    def printNum(self):
        print num
        num=200
         

if __name__ == "__main__":
    test=Test()
    print num
    test.printNum()
    





结论:

1、在一个类中定义变量,如果该变量定义为:类名.变量名 ——则此变量被所有实例共享。一旦实例重绑定变量后,则此变量为该实例所私有。此处定义的静态变量。若定义为:self.变量名——则此变量为各实例所私有。参考文章:python中的实例方法、静态方法、类方法、类变量和实例变量浅析

2、关于全局变量与局部变量,强烈建议不要出现同名的情况,局部变量在使用前需先定义,如要使用全局变量,可用global关键字声明。关于全局变量与局部变量的区别,可参考:Python语法基础——关于全局变量与局部变量




<think>好的,用户想了解Python中的变量作用域规则,并且需要示例。我需要根据提供的引用内容来组织回答。首先,确认用户的问题是关于变量作用域的,可能需要解释不同作用域类型,以及它们的层次结构。 根据引用[2]和[3],作用域分为局部、闭包、全局和内置作用域。需要分别解释每个作用域,并给出例子。比如局部变量在函数内部定义,只能在函数内访问。闭包作用域涉及嵌套函数,内部函数可以访问外部函数的变量,如引用[1]中的例子。全局作用域是在函数外定义的变量,如引用[4]中的global_var。内置作用域是Python自带的函数和变量,比如print。 然后,要说明变量查找的顺序:局部→闭包→全局→内置,这被称为LEGB规则。需要举一个例子说明查找顺序,比如当在函数内部引用一个变量时,Python如何逐层查找。 接下来,用户可能需要知道如何在不同作用域修改变量。比如,在函数内部修改全局变量需要使用global关键字,修改闭包作用域的变量需要nonlocal关键字。引用[1]和[4]中的例子可以支持这一点,但需要补充更明确的示例,比如在函数中使用global声明来改变全局变量。 最后,生成相关问题,帮助用户深入理解,比如变量查找顺序、关键字global和nonlocal的作用、闭包应用场景等。确保问题覆盖用户可能关心的其他方面。 需要检查所有示例是否符合LaTeX格式要求,行内公式用$...$,独立公式单独成段。但在这个问题中可能数学公式较少,更多是代码示例。所以确保代码块正确,用三个反引号包裹,并标明语言。 总结回答结构:先介绍作用域类型,再解释查找顺序,然后讨论如何修改不同作用域的变量,最后给出示例和相关问题。确保每个部分都引用对应的引用内容,并在末尾添加引用标识。</think>### Python变量作用域规则解析 Python变量作用域规则遵循**LEGB原则**(Local → Enclosing → Global → Built-in),决定了变量查找的优先级顺序[^3]。以下是具体规则和示例: --- #### 一、作用域层级分类 1. **局部作用域(Local Scope)** 函数内部定义的变量,仅在该函数内有效。 ```python def func(): x = 10 # 局部变量 print(x) # 输出10 func() ``` 2. **闭包作用域(Enclosing Scope)** 嵌套函数中,外层函数的变量可被内层函数引用[^1]。 ```python def outer(): y = 20 def inner(): print(y) # 访问闭包作用域的变量 inner() # 输出20 outer() ``` 3. **全局作用域(Global Scope)** 在函数外部定义的变量,整个模块内有效[^4]。 ```python global_var = "Hello" def print_global(): print(global_var) # 访问全局变量 print_global() # 输出"Hello" ``` 4. **内置作用域(Built-in Scope)** Python内置的变量或函数(如`print`, `len`)。 --- #### 二、变量查找顺序 Python按 **局部→闭包→全局→内置** 顺序查找变量: ```python message = "global scope" def outer(): def inner(): print(message) # 优先查找闭包作用域,未找到则查找全局作用域 inner() outer() # 输出"global scope" ``` --- #### 三、修改变量的作用域 1. **`global`关键字** 在局部作用域中修改全局变量: ```python count = 0 def increment(): global count count += 1 increment() print(count) # 输出1 ``` 2. **`nonlocal`关键字** 在闭包作用域中修改外层函数的变量: ```python def outer(): num = 5 def inner(): nonlocal num num = 10 # 修改闭包作用域的变量 inner() print(num) # 输出10 outer() ``` --- #### 四、作用域冲突示例 ```python x = "global" def test(): x = "local" print(x) # 输出"local"(局部变量优先) test() print(x) # 输出"global"(全局变量未被修改) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值