Python基础(九):变量进阶

简介: 变量 和 数据 都是保存在 内存 中的在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的

🌹前言

小袁开始更新Python系列教学文章了,从零带你入门,期待的你的关注❤️❤️

第一篇文章:Python基础(一):python和vscode环境安装

第二篇文章:Python基础(二):入门必备

第三篇文章:Python基础(三):运算符

第四篇文章:Python基础(四):数据类型

第五篇文章:Python基础(五):基础语句

第六篇文章:Python基础(六):函数

第七篇文章:Python基础(七):高级变量类型复习

第八篇文章:Python基础(八):名片管理系统

第九篇文章:Python基础(九):变量进阶

第十篇文章:博主正在加紧编写中…


变量进阶(理解)

目标

变量的引用

可变和不可变类型

局部变量和全局变量

一. 变量的引用

变量 和 数据 都是保存在 内存 中的

在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的

1.1 引用的概念

在 Python 中


变量 和 数据 是分开存储的

数据 保存在内存中的一个位置

变量 中保存着数据在内存中的地址

变量 中 记录数据的地址,就叫做 引用

使用 id() 函数可以查看变量中保存数据所在的 内存地址

注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用


变量 不再 对之前的数据引用

变量 改为 对新赋值的数据引用

1.2 变量引用 的示例

在 Python 中,变量的名字类似于 便签纸 贴在 数据 上


定义一个整数变量 a,并且赋值为 1

代码 图示

a = 1 image.png

将变量 a 赋值为 2

代码 图示

a = 2 image.png

定义一个整数变量 b,并且将变量 a 的值赋值给 b

代码 图示

b = a image.png

变量 b 是第 2 个贴在数字 2 上的标签


1.3 函数的参数和返回值的传递

在 Python 中,函数的 实参/返回值 都是是靠 引用 来传递来的

def test(num):
    print("-" * 50)
    print("%d 在函数内的内存地址是 %x" % (num, id(num)))
    result = 100
    print("返回值 %d 在内存中的地址是 %x" % (result, id(result)))
    print("-" * 50)
    return  result
a = 10
print("调用函数前 内存地址是 %x" % id(a))
r = test(a)
print("调用函数后 实参内存地址是 %x" % id(a))
print("调用函数后 返回值内存地址是 %x" % id(r))

二. 可变和不可变类型

不可变类型,内存中的数据不允许被修改:


数字类型 int, bool, float, complex, long(2.x)

字符串 str

元组 tuple

可变类型,内存中的数据可以被修改:


列表 list

字典 dict

a = 1
a = "hello"
a = [1, 2, 3]
a = [3, 2, 1]
demo_list = [1, 2, 3]
print("定义列表后的内存地址 %d" % id(demo_list))
demo_list.append(999)
demo_list.pop(0)
demo_list.remove(2)
demo_list[0] = 10
print("修改数据后的内存地址 %d" % id(demo_list))
demo_dict = {"name": "小明"}
print("定义字典后的内存地址 %d" % id(demo_dict))
demo_dict["age"] = 18
demo_dict.pop("name")
demo_dict["name"] = "老王"
print("修改数据后的内存地址 %d" % id(demo_dict))

注意:字典的 key 只能使用不可变类型的数据


注意


可变类型的数据变化,是通过 方法 来实现的

如果给一个可变类型的变量,赋值了一个新的数据,引用会修改

变量 不再 对之前的数据引用

变量 改为 对新赋值的数据引用

哈希 (hash)

Python 中内置有一个名字叫做 hash(o) 的函数

接收一个 不可变类型 的数据作为 参数

返回 结果是一个 整数

哈希 是一种 算法,其作用就是提取数据的 特征码(指纹)

相同的内容 得到 相同的结果

不同的内容 得到 不同的结果

在 Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查

键值对的 key 必须是不可变类型数据

键值对的 value 可以是任意类型的数据

三. 局部变量和全局变量

局部变量 是在 函数内部 定义的变量,只能在函数内部使用

全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量

提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!


3.1 局部变量

局部变量 是在 函数内部 定义的变量,只能在函数内部使用

函数执行结束后,函数内部的局部变量,会被系统回收

不同的函数,可以定义相同的名字的局部变量,但是 彼此之间 不会产生影响

局部变量的作用

在函数内部使用,临时 保存 函数内部需要使用的数据

def demo1():
    num = 10
    print(num)
    num = 20
    print("修改后 %d" % num)
def demo2():
    num = 100
    print(num)
demo1()
demo2()
print("over")

局部变量的生命周期

所谓 生命周期 就是变量从 被创建 到 被系统回收 的过程

局部变量 在 函数执行时 才会被创建

函数执行结束后 局部变量 被系统回收

局部变量在生命周期 内,可以用来存储 函数内部临时使用到的数据

3.2 全局变量

全局变量 是在 函数外部定义 的变量,所有函数内部都可以使用这个变量

# 定义一个全局变量
num = 10
def demo1():
    print(num)
def demo2():
    print(num)
demo1()
demo2()
print("over")

注意:函数执行时,需要处理变量时 会:


首先 查找 函数内部 是否存在 指定名称 的局部变量,如果有,直接使用

如果没有,查找 函数外部 是否存在 指定名称 的全局变量,如果有,直接使用

如果还没有,程序报错!

1) 函数不能直接修改 全局变量的引用

全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量

提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!


在函数内部,可以 通过全局变量的引用获取对应的数据

但是,不允许直接修改全局变量的引用 —— 使用赋值语句修改全局变量的值

num = 10
def demo1():
    print("demo1" + "-" * 50)
    # 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
    num = 100
    print(num)
def demo2():
    print("demo2" + "-" * 50)
    print(num)
demo1()
demo2()
print("over")

注意:只是在函数内部定义了一个局部变量而已,只是变量名相同 —— 在函数内部不能直接修改全局变量的值


2) 在函数内部修改全局变量的值

如果在函数中需要修改全局变量,需要使用 global 进行声明

num = 10
def demo1():
    print("demo1" + "-" * 50)
    # global 关键字,告诉 Python 解释器 num 是一个全局变量
    global num
    # 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
    num = 100
    print(num)
def demo2():
    print("demo2" + "-" * 50)
    print(num)
demo1()
demo2()
print("over")

3) 全局变量定义的位置

为了保证所有的函数都能够正确使用到全局变量,应该 将全局变量定义在其他函数的上方

a = 10
def demo():
    print("%d" % a)
    print("%d" % b)
    print("%d" % c)
b = 20
demo()
c = 30

注意


由于全局变量 c,是在调用函数之后,才定义的,在执行函数时,变量还没有定义,所以程序会报错!

代码结构示意图如下

image.png



4) 全局变量命名的建议

为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:

全局变量名前应该增加 g_ 或者 gl_ 的前缀

提示:具体的要求格式,各公司要求可能会有些差异



相关文章
|
1月前
|
Python
[oeasy]python050_如何删除变量_del_delete_variable
本文介绍了Python中如何删除变量,通过`del`关键字实现。首先回顾了变量的声明与赋值,说明变量在声明前是不存在的,通过声明赋予其生命和初始值。使用`locals()`函数可查看当前作用域内的所有本地变量。进一步探讨了变量的生命周期,包括自然死亡(程序结束时自动释放)和手动删除(使用`del`关键字)。最后指出,删除后的变量将无法在当前作用域中被访问,并提供了相关示例代码及图像辅助理解。
114 68
|
1月前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
36 9
|
2月前
|
Python
Python三引号用法与变量详解
本文详细介绍了Python中三引号(`"""` 或 `'''`)的用法,包括其基本功能、如何在多行字符串中使用变量(如f-string、str.format()和%操作符),以及实际应用示例,帮助读者更好地理解和运用这一强大工具。
85 2
|
3月前
|
Python
【10月更文挑战第5天】「Mac上学Python 8」基础篇2 - 变量深入详解
本篇将详细介绍Python中变量的使用方式和进阶操作,涵盖变量的输入与输出、变量的多重赋值、变量的内存地址管理以及变量的传递和交换等操作。通过本篇的学习,用户将对变量的使用有更深入的理解,并能灵活运用变量进行各种编程操作。
62 1
【10月更文挑战第5天】「Mac上学Python 8」基础篇2 - 变量深入详解
|
2月前
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
42 4
|
2月前
|
机器学习/深度学习 存储 数据挖掘
Python 编程入门:理解变量、数据类型和基本运算
【10月更文挑战第43天】在编程的海洋中,Python是一艘易于驾驭的小船。本文将带你启航,探索Python编程的基础:变量的声明与使用、丰富的数据类型以及如何通过基本运算符来操作它们。我们将从浅显易懂的例子出发,逐步深入到代码示例,确保即使是零基础的读者也能跟上步伐。准备好了吗?让我们开始吧!
41 0
|
4月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
68 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
3月前
|
存储 编译器 Python
Python--变量、输出与输入
【10月更文挑战第5天】
|
3月前
|
测试技术 Python
Python MagicMock: Mock 变量的强大工具
Python MagicMock: Mock 变量的强大工具
63 4
|
3月前
|
存储 Java 编译器
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
这篇文章是关于Python编程语言中变量命名规则、基本数据类型、算数运算符、比较运算符、逻辑运算符、赋值运算符以及格式化输出与输入的详细教程。
33 0
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。