4. python变量
列表可以修改,而字符串和元组不能。
以下是 Python 中变量的属性:
作用域 --> 数据所作用的范围
在函数中修改或者定义一个变量为全局变量,需要告诉解释器这个变量是全局的 --> 给变量添加一个标记global
否则解释器会认为这个变量是单独定义在函数这个域中
name = '常东雷'
def che_name():
global name
name = 'cdl'
4.1全局变量
全局变量 —> 直接定义在py文件中作用于Python的整个项目,存在于静态池,生命周期随着程序发生变化
4.2局部变量
局部变量 —> 定义在函数中的,作用范围只在函数中,有效函数有自身独立的域场,在函数内部定义的变量 只能在函数内部使用 其他的地方无法使用
4.3变量解析规则
当然这并不是说我们在函数里面就不能访问外面的全局变量。
在python的作用域规则里面,创建变量一定会一定会在当前作用域里创建一个变量,但是访问或者修改变量时会先在当前作用域查找变量,没有找到匹配变量的话会依次向上在闭合的作用域里面进行查看找。
所以如果我们修改函数foo的实现让它打印全局的作用域里的变量也是可以的:
a_string = "This is a global variable"
def foo():
print(a_string) # 1
foo()
#结果:This is a global variable
我们能够看到,全局变量是能够被访问到的
如果是可变数据类型(像list,dict这些)甚至能够被更改, 但是赋值不行(更改的是引用的引用,赋值却是改变的引用)。
在下面这个例子中
在函数内部的#1处,我们实际上**新创建**了一个局部变量,隐藏全局作用域中的同名变量。我们可以通过打印出局部命名空间中的内容得出这个结论。
所以在#2处打印出来的变量a_string的值并没有改变。
a_string = "This is a global variable"
def foo():
a_string = "test" # 1
print(locals()) # {'a_string': 'test'}
foo()
print(a_string) # 2 This is a global variable
在#1处,python解释器会尝试查找变量a_string,
当然在函数的本地作用域里面是找不到的,所以接着会去上层的作用域里面去查找。
但是另一方面,假如我们在函数内部给全局变量赋值,结果却和我们想的不一样, 不是改变全局变量,而是生成一个同名局部变量
4.4变量生存周期
值得注意的一个点是,变量不仅是生存在一个个的命名空间内,他们都有自己的生存周期,请看下面这个例子:
def foo():
x = 1
foo()
print(x) # 1
"""# 1
Traceback(most recent calllast):
NameError: name 'x' is not defined
"""
#1处发生的错误不仅仅是因为作用域规则导致的
尽管这是抛出了NameError的错误的原因 它还和python以及其它很多编程语言中函数调用实现的机制有关。
在这个地方这个执行时间点并没有什么有效的语法让我们能够获取变量x的值,因为它这个时候压根不存在!
函数foo的命名空间随着函数调用开始而开始,结束而销毁。
#回调函数:
回调函数 ---- 把函数当做实参赋值给某个函数A的形参, 在函数A中功能体的适当的逻辑部分进行调用 这种函数就称为回调函数