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()
两段代码都可以单独运行。
通过跟踪运行,可以更好理解?变量作用范围。
|