python变量作用范围(全局、局部)测试例子,入口PYHON__name__作用

python变量不需要定义就可以使用。对于先学过C 、JAVA等,再学PYTHON的,可能会觉得不习惯,但是真正用得多了,就会发现,PYTHON其实还是很好理解。

误区一:定义和声明的区别

举例:如果在FOR循环中使用列表,一定要先初始化,否则会提示错误。

str_lb='we_love_money'
for i in str_lb:
    lb_char.append(i)
    print(i)
print(lb_char)

程序执行提示:NameError: name 'lb_char' is not defined

修改:

str_lb = 'we_love_money'
lb_char = []
for i in str_lb:
    lb_char.append(i)
    print(i)
print(lb_char)

误区二:全局变量的使用

g_i =  10
def c_cal(x,y):
    #global g_i
    g_i = g_i +10
    a= x + y
    b = g_i+5
    print(locals())
    print(globals())
    return x+y+g_i
c = c_cal(2,3)
print(c)

上述代码执行:UnboundLocalError: local variable 'g_i' referenced before assignment

当把#global g_i取消注释时,能正常执行。我们可以通过打印print(locals())、print(globals())来跟踪变量的性质。

总结:在函数里面,感觉只要有 =, +=, -= 这样的赋值语句,被赋值的变量就是local的,如果单纯出现  x = g_i +y 这样的语句,g_i 还会被认为是全局变量。

误区三:程序入口,为什么要用if __name__ == '__main__':

任何一个PYTHON程序,如果直接运行, __name__值 为__main__ ,如果 是import ,__name__ 就是文件名。看下文例子。

现举个完整的例子,以便更好理解变量的作用范围:

###    设计: WECHAT: zjghotpepper
###    功能: PYTHON 变量作用范围测试
###  完成度: 80%
###主要问题: 学习
###设计时间: 2021-08-24
###    VER: PYTHON3.9
### design: in PYCHARM 2021.1.3 community edition
###     OS: Windows10

# global var_global_str 在其它编程语言,全局变量 是这么定义的,但是 PYTHON与众不同,直接赋值
import test_var_fw_import

var_global_str = 'var_global_header '
var_global_i = 10


# ,var_g_i=1000

# python 3.0 以后,var_in_class(object) 和 var_in_class()是一样的,之前有区别,估计现在没有人用老版 了。
class var_in_class(object):
    var_front_str = "var_front_str"
    var_front_int = 500

    def __init__(self, init_dr='ww'):
        self.var_in_self_a = 'var_in_self_a'
        self.var_in_sef_int_1 = 100
        self.var_init_dr = init_dr
        self.var_i = 1
        # 必须 有上一句,否则报错:AttributeError: 'var_in_class' object has no attribute 'var_i'
        self.var_i = self.var_i + 1
        # 上一句,没什么 大作用,是理解 变量作用域的问题, 等 价于 一句: self.var_i = 2

    def get_var(self):
        dir = 'in get var'
        # 下一行,打印会出错,PYTHON认为它是局部变量,但是引用前,没有赋值
        # print(var_global_str)
        var_global_str = dir
        print('now , is local var :' + var_global_str)
        return self.var_init_dr

    def set_var(self, set_zr):
        global var_global_i
        var_global_i = var_global_i + 10
        self.var_in_self_a = set_zr
        self.var_in_sef_int_1 = self.var_in_sef_int_1 + 500
        return self.var_in_self_a

    def f_set(self):
        global var_global_str
        # 下一行 如果 要使用必须在前一行申明为 global ,否则 PYTHON以为是局部变量,提示
        # ERROR:UnboundLocalError: local variable 'var_global_str' referenced before assignment
        # 这和其它 所以软件有区别
        print('in class func f_set:' + var_global_str)
        var_global_str = 'in func f-set:' + str(self.var_i) + ':' + var_global_str
        return var_global_str

    def f_set_glob_i(self):
        global var_global_str
        global var_global_i
        var_global_i = var_global_i + 1000
        # 下一行 如果 要使用必须在前一行申明为 global ,否则 PYTHON以为是局部变量,提示
        # ERROR:UnboundLocalError: local variable 'var_global_str' referenced before assignment
        # 这和其它 所以软件有区别
        print('in class func f_set:' + var_global_str)
        var_global_str = 'in func f-set:' + str(var_global_i) + ':' + var_global_str
        return var_global_str


# 任何一个PYTHON程序,如果直接运行, __name__值 为__main__ ,如果 是import ,__name__ 就是文件名
if __name__ == '__main__':
    c_class_bd = var_in_class("pass in body")  # 必须 加 “。。”参数
    str_get = c_class_bd.get_var()
    print("get:" + str_get)
    # 下一行,无法执行,因为 DIR是CLASS中的局部变量
    # a_test = c_class_bd.dir
    str_set = c_class_bd.set_var('prog pass the valus')
    print("set:" + str_set)
    print('acess dirc:' + c_class_bd.var_in_self_a)
    print('acess dirc front:' + c_class_bd.var_front_str)
    print('body+func:' + var_global_str)
    c_class_bd.f_set()
    print('is change ? :' + var_global_str)
    print('now print class var: is 100?')
    print(c_class_bd.var_in_sef_int_1)
    a = c_class_bd.set_var('to look : is 600,100,or ?')
    print(a)
    print(c_class_bd.var_in_sef_int_1)
    a = c_class_bd.set_var('again to look : is 600,1100,or ?')
    print(c_class_bd.var_in_sef_int_1)
    # 你会加 吗?
    a = c_class_bd.set_var('and again to look : is 600,1100,or ?')
    print(c_class_bd.var_in_sef_int_1)
    print('now ,look:' + var_global_str)
    a = c_class_bd.f_set_glob_i()
    # 结果是多少 ?
    print('the last ,look:' + var_global_str)
    ## __name__ is what ?
    ## 看,name 在import中是什么 ?
    print('test __name__:')
    aa = test_var_fw_import.get_var_test()
    print(aa)
    print('over')

程序中为了理解__name__入口参数,需要另一段代码,文件名命名为

test_var_fw_import.py:
###  设计    :WECHAT: zjghotpepper
###  功能    :PYTHON 变量作用范围测试
###   完成度  : 80%
### 主要问题  : 学习
### 设计时间 : 2021-08-24
### VER    : PYTHON3.9
### design : in PYCHARM 2021.1.3 community edition
### OS     :Windows10

#global var_global_str 在其它编程语言,全局变量 是这么定义的,但是 PYTHON与众不同,直接赋值
var_global_str = 'import_var_global :'

var_global_str = var_global_str +__name__+':'
def get_var_test():
    dir = 'in get var'
    # 下一行,打印会出错,PYTHON认为它是局部变量,但是引用前,没有赋值
    # print(var_global_str)
    var_global_str = 'look:'+ __name__ + ': is in get '
    # var_global_str =   dir
    print('now , is local var :' + var_global_str)
    return var_global_str

#python 3.0 以后,var_in_class(object) 和 var_in_class()是一样的,之前有区别,估计现在没有人用老版 了。
class var_import_class(object):
    var_front_str = "var_front_str"
    var_front_int = 500

    def __init__(self, init_dr):
        self.var_in_self_a = 'var_in_self_a'
        self.var_in_sef_int_1 = 100
        self.var_init_dr = init_dr
        self.var_i = 1
        # 必须 有上一句,否则报错:AttributeError: 'var_in_class' object has no attribute 'var_i'
        self.var_i =  self.var_i + 1
        global var_global_str
        var_global_str = var_global_str +':'+ __name__
        # 上一句,没什么 大作用,是理解 变量作用域的问题, 等 价于 一句: self.var_i = 2

    def get_var(self):
        dir = 'in get var'
        # 下一行,打印会出错,PYTHON认为它是局部变量,但是引用前,没有赋值
        #print(var_global_str)
        global var_global_str
        var_global_str =  var_global_str +': is in get '
        #var_global_str =   dir
        print('now , is local var :'+var_global_str)
        return self.var_init_dr

# 任何一个PYTHON程序,如果直接运行, __name__值 为__main__ ,如果 是import ,__name__ 就是文件名
var_global_str = var_global_str +__name__

if __name__ == '__main__':
    print('test_var_fw_import:'+'is run')
    print('global values:')
    print(var_global_str)
    print('in func:')
    get_var_test()

两段代码都可以单独运行。

通过跟踪运行,可以更好理解 变量作用范围。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值