iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python基础之变量进阶
  • 532
分享到

Python基础之变量进阶

进阶变量基础 2023-01-31 00:01:27 532人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

变量的引用 变量和数据都是保存在内存中的; 在python中函数的参数传递以及返回值都是靠引用传递的。 函数引用的概念 在Python中 变量和数据时分开存储的; 数据保存在内存中的一个位置; 变量保存着数据在内存中的地址; 变量中

变量的引用

  • 变量和数据都是保存在内存中的;
  • python中函数的参数传递以及返回值都是靠引用传递的。

函数引用的概念

Python

  • 变量和数据时分开存储的;
  • 数据保存在内存中的一个位置;
  • 变量保存着数据在内存中的地址;
  • 变量中记录数据的地址,就叫做引用;
  • 使用id()函数可以查看变量中保存数据所在的内存地址。

注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是自改了数据的引用;即变量不再对之前的数据引用;变量改为对新赋值的数据引用。

a = 1

id(a)
140721952793280

id(1)
140721952793280

b = a
id(b)
140721952793280

a = 2
id(a)
140721952793312
id(b)
140721952793280

b = a
id(b)
140721952793312
b = 2
id(b)
140721952793312

函数引用理解

我们可以把变量的名字理解为便签纸,而变量名和数据就相当于把便签纸贴在数据上;
当我们a = b时,就是把a,b两张标签纸贴在了同一个数据上,而如果我们把a重新赋值,就是把a的便签纸撕下来贴在另一个数据上,但b的便签纸位置不变;

函数传参与引用的关系

函数参数的传递,实际传送的是对应实参变量的引用,而不是实参保存的数据

def test(num):
    print("在函数内部%d对应的内存地址是%s" % (num, id(num)))


a = 10

print("a 变量保存数据的内存地址是 %s" % id(a))

test(a)

# a 变量保存数据的内存地址是 140722085962720
# 在函数内部10对应的内存地址是140722085962720

函数返回值与引用

函数的返回值同样也是返回变量的引用,而不是真实的数据;
数据地址本质上就是一个数字;

def test(num):

    result = "test_passWord"

    print("函数内返回值result的内存地址是 %s" % id(result))

    return result


a = 10
r = test(a)
print("返回的 %s 的内存地址是 %s" % (r, id(r)))
# 函数内返回值result的内存地址是 2333111002800
# 返回的 test_password 的内存地址是 2333111002800

可变类型和不可变类型

修改可变类型 是修改数据的内容,而不会修改变量引用的地址;修改可变类型,要用对象.方法()进行修改;
重新赋值会修改变量引用的地址;

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

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

  • 列表;
  • 字典;

可变类型修改和重赋值对引用的影响

可变类型比如列表,字典,对它们进行数据修改时,不会对引用的内存地址造成影响;
只有当我们对变量进行重新赋值之后,才会影响引用;

下面举例仅举列表的例子,字典一样,就不赘述了。

# 列表数据修改和重赋值对引用的影响
    a = [1,2,3]
    id(a)
    1956997579272

    a.append(4)
    a
    [1, 2, 3, 4]
    id(a)
    1956997579272
    a.remove(2)
    a
    [1, 3, 4]
    id(a)
    1956997579272
    a.clear()
    a
    []
    id(a)
    1956997579272

    a = ['a','s','d']
    id(a)
    1956997945160

字典的key只能使用不可变类型
注意:可变类型的数据变化,是通过方法来是实现的;

哈希算法

d = {}
d["name"] = "zhangsan"
d
{'name': 'zhangsan'}
d[1] = "整数"
d
{'name': 'zhangsan', 1: '整数'}
d[(1,)] = "元组"
d
{'name': 'zhangsan', 1: '整数', (1,): '元组'}

d[[1,2,3]] = "列表"
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'

d[{"age":18}] = "字典"
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'dict'
  • Python中内置一个名字叫做hash(o)的函数,它接收一个不可变类型的数据作为参数,返回结果是一个整数;
  • 哈希是一种算法,其作用是提取数据的特征码(指纹);相同的数据得到相同的结果,不同的数据得到不同的结果;
  • 在python中,设置字典的键值对时,会首先对key进行hash,以决定如何在内存中保存字典的数据,以方便后续的字典的增删改查;
  • 字典 键值对的key必须是不可变类型数据;键值对的value可以是任意类型的数据;

哈希算法,只能哈希不可变类型;
因为字典的key要使用哈希,所以,字典的key只能是不可变类型;

hash(1)
1

hash("hello")
2061306992742373012
hash("hello python")
9189581639312291988

hash((1,2))
3713081631934410656

hash([1,2])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'

hash({"age":18})
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'dict'

局部变量和全局变量

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

在其他语言中,大多都不推荐使用全局变量,因为可变范围太大,不可控情况多;

局部变量

局部变量介绍

  • 局部变量是在函数内部定义的变量,只能在函数内部使用;
  • 函数执行完成后,函数内部的局部变量,会被系统回收;
  • 不同的函数,可以定义相同的名字的局部变量,彼此之间不会产生影响;

局部变量的作用:在函数内部使用,临时保存函数内部需要使用的数据;

局部变量只能在定义的函数内部使用,不能被函数外部或函数外部函数使用

def demo1():
    num = 10
    print("demo1内部的局部变量num的值为%d" % num)

# 因为num是num1的局部变量,而demo1外面也没有定义num变量,所以本句运行后会报错,注释掉
# print(num)  # NameError: name 'num' is not defined


def demo2():
    # 同样的,demo2重吗既没有num的变量,外部也没有定义全局的num变量,运行会报错,注释掉
    # print(num)  # NameError: name 'num' is not defined
    pass


demo1()  # demo1内部的局部变量num的值为10
demo2()

局部变量的生命周期

当局部变量被执行时创建;当函数执行完后局部变量被系统回收,生命结束;
局部变量在生命周期内可以用来临时存储信息。
用断点可以验证局部变量的生命周期。

不同函数内的同名局部变量

不同函数间可以定义相同名的局部变量,彼此之间互不关联,这就像1班有一个小明,2班也有一个小明,但他们并不是同一个人;

def demo1():
    num = 10
    print("demo1内部的局部变量num的值为%d" % num)  # demo1内部的局部变量num的值为10


def demo2():
    num = 100
    print("demo2的num:", num)  # demo2的num: 100


demo1()  
demo2()

全局变量

全局变量的使用

在所有函数外部定义的变量,就叫做全局变量;
可以给全局所有代码调用,包括全局变量的平行级和下级函数内部;

num = 10
def demo1():
    print("demo1的num", num)
def demo2():
    print("demo2的num", num)

demo1()
demo2()
print(num)

# demo1的num 10
# demo2的num 10
# 10

函数内部不能直接修改全局变量的值

在函数内部,可以直接通过全局变量的引用获取对用的数据;
但是,在python中,函数内部不能直接修改全局变量的值,如果用全局变量名在函数内部重新赋值,本质上只是创建一个同名局部变量而已

num = 10


def demo1():
    # 这个语句 并不是修改全局变量的值,而是创建一个同名局部变量
    num = 90
    print("demo1的num", num)


def demo2():
    print("demo2的num", num)


demo1()
demo2()
print(num)

# demo1的num 90
# demo2的num 10
# 10

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

  1. 先从函数内部找指定名称的局部变量,如果有,直接使用;
  2. 函数内部没找到变量,就去函数外部找指定名称的全局变量,如果有,直接使用;
  3. 还没找到,就报错;

用global在函数内修改全局变量

如果希望在函数内部修改全局变量的值,使用global声明一下变量即可;
global关键字会告诉解释器后面声明的变量是一个全局变量,这样,再使用赋值语句时,就不会创建局部变量了。

num = 10


def demo1():
    # 告诉解释器,这个就是全局变量,不用再创建同名局部变量了
    global num
    num = 90
    print("demo1的num", num)


def demo2():
    print("demo2的num", num)


demo1()
demo2()
print(num)

# demo1的num 90
# demo2的num 90
# 90

全局变量定义的位置

  • 在函数中要使用的变量必须在函数被调用前就被定义好,否则会报错;
  • 一般讲所有的全局变量都放在其他函数的上方,这样可以确保每个函数都能正确的使用全局变量。

代码结构顺序:

  1. shebang
  2. import 模块
  3. 全局变量
  4. 函数定义
  5. 执行代码

全局变量命名的建议:全局变量建议在变量名前g_变量名 或者gl_变量名

--结束END--

本文标题: Python基础之变量进阶

本文链接: https://www.lsjlt.com/news/182149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python基础之变量进阶
    变量的引用 变量和数据都是保存在内存中的; 在python中函数的参数传递以及返回值都是靠引用传递的。 函数引用的概念 在python中 变量和数据时分开存储的; 数据保存在内存中的一个位置; 变量保存着数据在内存中的地址; 变量中...
    99+
    2023-01-31
    进阶 变量 基础
  • JavaScript基础之变量
    目录1.变量概述1.1变量在内存中的存储 1.2 变量的使用1.声明变量2.赋值3.变量的初始化1.3变量语法扩展1.更新变量2.声明多个变量3.声明变量特殊情况1.5变量...
    99+
    2024-04-02
  • python基础之局部变量和全局变量
    四种基本的函数类型 局部变量 就是在函数内部定义的变量【作用域仅局限于函数内部】 不同的函数 可以定义相同的局部变量,但是各自用各自的 不会产生影响 局部变量的作用:为了临时...
    99+
    2024-04-02
  • Python基础-变量
    变量 1、变量的类型 变量是存储在内存中的值,这就意味着创建一个变量就会在内存中开辟一块空间来存储这个变量,在python中,变量可以指定不同的数据类型,这些类型可以存储整数,小数,浮点数等。 2、变量的作用 在python中,变量的作用就...
    99+
    2023-01-31
    变量 基础 Python
  • Python基础 变量
    Python的变量,于其说是变量更贴切的是标签。由于对于Python来说一切皆为对象,因此变量可以理解为是对象的一个标签。 【变量命名规则】 1. 由字母、数字和下划线组成; 2. 不能由数字开头; 3. Pyth...
    99+
    2023-01-31
    变量 基础 Python
  • Python基础之面向对象进阶详解
    目录面向对象三大特征介绍继承语法格式查看类的继承层次结构object根类dir()查看对象属性str()方法的重写多重继承MRO()super()获得父类定义多态特殊方法和重载运算符...
    99+
    2024-04-02
  • Python基础之变量和变量实现的简单乘
    上篇我们知道了关于python的一个hello world的简单程序代码,现在我们来了解关于python里面的变量,我们来了解下,变量是什么? 变量:变量是为了存储程序运算过程中的一些中间结果,为了方便之后的调用,同一变量可以重新赋值。 ...
    99+
    2023-01-30
    变量 简单 基础
  • python基础之变量和数据类型
    目录变量和数据类型Python中变量的命名规则总结变量和数据类型 赋值不需要指定类型,如何定义变量 # 定义 规则 变量名=数据 a=10 #python不声明...
    99+
    2024-04-02
  • Python基础知识之变量的详解
    目录一.定义二.命名方法2.1小驼峰命名法2.2大驼峰命名法2.3下划线命名法三.命名规则3.1标识符3.2关键字四.使用方法4.1单变量赋值:4.2底层逻辑:4.3总结:5.变量进...
    99+
    2024-04-02
  • Python基础之函数参数与返回值进阶
    参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部; 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值。 函数的返回值 进阶 利用元组返回多个函数值 可以用元组让函数返回...
    99+
    2023-01-31
    进阶 函数 返回值
  • Python变量基础知识
    目录1.什么是变量2.变量的命名规则3.python中的关键字和保留字4.常用的变量名5.变量的赋值6.变量的数据类型6.1.数字6.2.布尔类型6.3.字符串6.4.type()函...
    99+
    2024-04-02
  • Python入门基础之变量及字符串
    目录变量关于变量变量名命名规则字符串原始字符串长字符串总结变量 当把一个值赋给一个名字时,它就会存储在内存中,我们把这块内存称为变量(variable)。 在大多数语言中,都把这种行...
    99+
    2024-04-02
  • Python基础之注释,算数运算符,变量
    Python的注释 注释的作用:用自己熟悉的语言,对某些代码进行标注说明,增强程序的可读性; 在python解释器解释代码的过程中,凡是#右边的,解释器都直接跳过这一行; 注释的分类 单行注释 # 这里是注释 print("hello w...
    99+
    2023-01-31
    注释 变量 运算符
  • Spring零基础到进阶之鸿蒙开篇
    目录Spring是什么1.什么是容器?2.什么是IOC?3.理解Spring IoC4.了解DISpring是什么 用一句简单的话来概括Spring:Spring是包含了众多工具方法...
    99+
    2024-04-02
  • Python基础之变量的相关知识总结
    变量全都是引用 跟其他编程语言不同,Python的变量不是盒子,不会存储数据,它们只是引用,就像标签一样,贴在对象上面。 比如: >>> a = [1, 2, ...
    99+
    2024-04-02
  • C++学习进阶之Makefile基础用法详解
    目录1. Makefile基本语法与执行2. Makefile简化过程3. Makefile生成并使用库3.1 动态库的建立与使用3.2 动态加载库的建立与使用总结1. Makefi...
    99+
    2024-04-02
  • Python基础之进程详解
    目录一、前言二、基本用法三、创建单个进程四、创建多个进程五、进程池六、锁七、进程间通信八、信号量九、数据共享十、总结一、前言 进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运...
    99+
    2024-04-02
  • 【Python基础 03】变量的基本使用
    程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值 = 左...
    99+
    2023-01-31
    变量 基础 Python
  • python基础知识之函数初阶——命名
    python中的命名空间分三种: 内置的命名空间,在启动解释器的时候自动加载进内存的各种名字所在的空间,比如print,input等不需要定义就可以使用的名字 全局命名空间,就是从上到下所有我们定义的变量名和函数名所在的空间,是在程序从上...
    99+
    2023-01-31
    基础知识 函数 python
  • Python基础语法之变量与数据类型详解
    目录一. 输出函数print1.1 可以输出数字1.2 可以输出字符串1.3 可以输出表达式1.4 可以输出至文件中二. 变量与数据类型2.1 整型2.2 浮点型2.3 字符串型2....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作