python的局部变量和全局变量!

本文介绍了Python的局部变量和全局变量。局部变量在函数内部定义,不同函数可有同名变量,不互相影响,用于临时存储数据。全局变量在多个函数中可访问,但若在函数内部重新定义则会变为局部变量。使用`global`关键字可以明确修改全局变量的值。不可变类型的全局变量在函数中未用`global`声明时无法修改,而可变类型的全局变量可以改变其内容。

局部变量

什么是局部变量

通俗定义:函数内部定义的变量就叫局部变量。

话不多说,代码如下:

def test1():
    a = 300 # 定义一个局部变量a,并初始化300
    print("--test1--修改前:a=%s" % a)
    a = 200 # 给变量a重新赋值200
    print("--test1--修改后:a=%s" % a)
def test2():
    a = 400 # 定义另一个局部变量a,并初始化400
    print("--test2--修改后:a=%s" % a)
# 分别调用函数test1,test2
test1()
test2()
输出:
--test1--修改前:a=300
--test1--修改后:a=200
--test2--修改后:a=400

结论:

Python资源共享群:484031800

  • 局部变量就是在函数内部定义的变量。
  • 不同的函数内部可以定义名字相同的变量,但它们不会产生影响。
  • 局部变量的作用,为了临时保存数据需要在需要在函数中定义变量来进行存储。
  • 全局变量
  • 什么是全局变量
  • 定义:如果一个变量既能在一个函数中使用,也可以在其他函数中使用,这样的变量就是全局变量。
  • 代码如下:
a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2,功能是打印变量a的值
def test1():
    print(a)
def test2():
    print(a)
test1()
test2()
"""
结果如下:
100
100
"""

如何修改全局变量的值

首先,我们可能是这样想的:

a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2
def test1():
    print("修改前:a=%s"%a)
    a = 300
    print("修改后:a=%s"%a)
def test2():
    print(2)
test1()
test2()
"""
结果如下:
UnboundLocalError: local variable 'a' referenced before assignment
异常解释:局部变量a在被引用前没有被定义
"""

那我们把函数test1中的内容修改如下:

def test1():
    # print("修改前:a=%s"%a)
    a = 300
    print("修改后:a=%s"%a)
"""
结果如下:
修改后:a=300
100
"""

这次我们发现,错误消失了,函数test2中打印变量a的值并没有改变还是100,这是为什么呢?

原因:如果一个全局变量在函数内被重新定义过,再在函数内使用变量则默认为局部变量;如果在函数内没有被定义,直接使用会被视为全局变量。

此时,函数test1中的只是定义了一个名字相同的局部变量而已,并没有改变全局变量的值。

global的使用

这前我们想的法子都不能修改全局变量的值,这下就该认识一个新的关键字 global ,它的功能就是如果需要在函数内定义(修改)全局变量,则要先用global进行声明。

把之前的代码修改如下:

a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2
def test1():
    global a # 声明函数中使用的a是全局变量
    print("修改前:a=%s" % a)
    a = 300
    print("修改后:a=%s" % a)
def test2():
    print(2)
test1()
test2()
"""
结果如下:
修改前:a=100
修改后:a=300
300
"""

这下终于修改成功了。

可变类型与不可变类型的全局变量

发现我们之前定义的全局变量是数字类型,是属于不可变类型的,那么修改一个可变类型的全局变量有什么不同呢?

a = [100, 200]  # 定义一个列表全局变量a
# 分别定义函数test1、test2
def test1():
    print("修改前:a=%s" % a)
    a.append(300)
    print("修改后:a=%s" % a)
def test2():
    print(a)
test1()
test2()
"""
结果如下:
修改前:a=[100, 200]
修改后:a=[100, 200, 300]
[100, 200, 300]
"""

我们发现当全局变量为可变类型时,即使我们不是用global关键字声明全局变量,它还是会被修改。

事实上:

  • 在函数中不是用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
  • 对于不可变类型的全局变量来说,因其指向的数据不能被修改,所以不是用global时无法修改全局变量。
  • 对于可变类型的全局变量来说,因其指向的数据可以改变,所以不用global时可以修改全局变量。
### Python局部变量全局变量定义 #### 定义Python 中,**局部变量**是指在函数内部定义仅限于该函数作用域内的变量[^2]。而 **全局变量** 则是在函数外部定义变量,其作用范围覆盖整个程序文件,只要函数调用发生在全局变量定义之后即可访问它[^3]。 --- ### 区别 1. **作用域** - 局部变量的作用域局限于定义它的函数内部,无法在函数外部或其他函数中使用。 - 全局变量在整个脚本范围内有效,可以在任意位置被读取或修改(前提是遵循特定规则)[^3]。 2. **生命周期** - 局部变量只存在于函数执行期间,当函数结束时会被销毁。 - 全局变量则会在整个程序运行过程中持续存在,直到程序终止[^3]。 3. **与声明** - 如果希望在一个函数内为定义在函数外的变量重新,则需要显式地通过 `global` 关键字声明此变量全局变量[^1]。否则,默认情况下,Python 将视之为一个新的局部变量。 - 函数内部首次出现在等号右侧的未声明变量默认被认为是全局变量的一部分;但如果在同一表达式的左侧再次出现相同名称的新变量名,则会导致错误,因为此时解释器认为这是试图引用尚未初始化的本地副本[^3]。 --- ### 使用方法 以下是关于如何正确处理局部全局变量的一些示例: #### 示例 1: 正确操作全局变量 如果要在函数内部更改已存在的全局变量,需先利用 `global` 进行声明: ```python x = 10 # 全局变量 def modify_global(): global x # 告诉编译器我们正在使用的 'x' 是全局的那个 x += 5 modify_global() print(x) # 输出将是 15 ``` #### 示例 2: 错误尝试直接修改全局变量而不加声明 如果没有提前指定某个变量作为全局对象对待,那么即使同名也会创建新的局部实例而非影响原始数据结构: ```python y = 20 # 另一全局变量 def try_modify_without_global(): y *= 2 # 这里实际上创建了一个名为'y'的新局部变量而不是更新原有的那个 # 导致 UnboundLocalError 报错,除非加上 global y try_modify_without_global() # 上述代码会抛出异常:"UnboundLocalError" ``` #### 示例 3: 避免混淆的情况——安全引用全局变量 可以通过简单地读取全局变量的内容来避免潜在冲突: ```python z = 30 def safely_use_global(): result = z * 3 # 不涉及重命名或者再分配给新实体的操作都是允许的 return result output = safely_use_global() print(output) # 成功打印90 ``` #### 示例 4: 结合局部与全局变量 有时可能既想保留原有全局状态又生成临时计算结果存入独立空间存储下来供后续单独处置: ```python w = 40 def combine_local_and_global(): local_w = w + 7 # 创建一个基于当前全局‘w’得到增强版版本保存至local_w之中 return local_w new_value = combine_local_and_global() print(new_value) # 显示数应等于47 print(w) # 而原初设定保持不变依旧显示为40 ``` --- ### 总结 理解掌握好局部变量全局变量的概念及其相互关系对于编写清晰高效的 python 应用至关重要。合理运用这些特性可以帮助开发者更好地管理复杂项目中的资源分布状况以及提升整体性能表现水平。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值