python变量

本文介绍了Python中的变量类型,包括全局和局部变量,以及它们的作用域。全局变量在整个程序中有效,而局部变量仅限于函数内部。在函数内部修改全局变量需要使用`global`关键字。Python的变量解析遵循LEGB规则,先查找局部作用域,然后是全局作用域。变量的生存周期与其所在的作用域关联,函数调用结束后,其内部变量将不再存在。此外,还讨论了如何在函数内部访问和修改全局变量的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中功能体的适当的逻辑部分进行调用 这种函数就称为回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值