IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python变量作用范围(全局、局部)测试例子,入口PYHON__name__作用 -> 正文阅读

[Python知识库]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()

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

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:48:56  更:2021-08-27 11:49:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 23:52:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计