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'

原文地址:https://www.cnblogs.com/yifchan/p/python-1-10.html

时间: 2024-10-29 08:00:25

Python基础之变量进阶的相关文章

python基础_变量进阶

变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本

python基础(变量,常量,python变量内存管理,变量的三个特征,花式赋值,注释 )

python基础 变量 定义:变量用来描述世间万物变化的状态 组成: 变量名:接收变量值 赋值符号:把变量值赋值给变量名 变量值:就是一个数值 注意: 变量名由数字/字母/下划线组成,不能以数字开头 变量名不能以下关键字命名 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global',

python基础3 - 变量的基本使用和命名

4.变量的基本使用 4.1 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值 = 左边是变量名 = 右边是存储在变量中的值 变量名 = 值 变量定义之后,后续就可以直接使用了 4.2 变量的类型 在内存中创建一个变量,会包括: 名称.保存的数据.存储数据的类型.地址(标示) 在 Python 中定义变量是 不需要指定类型(在其他很多高级语言中都需要) 数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型

Python基础之变量和变量实现的简单乘法运算

上篇我们知道了关于python的一个hello world的简单程序代码,现在我们来了解关于python里面的变量,我们来了解下,变量是什么? 变量:变量是为了存储程序运算过程中的一些中间结果,为了方便之后的调用,同一变量可以重新赋值. 变量的特点:具有描述性的标记,存储在内存里. 我们来看个列子,简单了解变量乘法运算: x = 3 y = 9 z = x * y print("3*9=",z) print("z=",z) 如图所示:左代码,右交互器输出结果. 我们

Python基础九函数进阶(一)

Q:Python运行代码时,遇到函数是怎么做到的? A:从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读入内存,表示知道这个函数存在了,至于函数内部的变量跟逻辑,解释器根本不关心. 当执行到函数调用的时候,Python解释器会再开辟一块内存来存储这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中,函数中的变量只能在函数内部使用

python基础_变量

变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建 等号(=)用来给变量赋值= 左边是一个变量名= 右边是存储在变量中的值 变量名 = 值 变量定义之后,后续就可以直接使用了 1) 变量演练1 -- iPython # 定义 qq_number 的变量用来保存 qq 号码 In [1]: qq_number = "1234567"

Python基础-2 变量与常量

变量与常量 变量:在程序运行过程中,值会发生变化的量 常量:在程序运行过程中,值不会发生变化的量 无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值. 这里有一点需要注意的是,在python中是不需要声明类型的.这是根据Python的动态语言特性而来.变量可以直接使用,而不需要提前声明类型. 变量的定义 Python 中的变量不需要声明类型 a = 4 b = "hello" c = [1,2] d = (1,2) 这些变量都是不需要声明它的类型的,在C和Java中是

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

Python基础之变量,常量,注释,数据类型

由于上学期学了C语言,对于这一块的内容肯定算熟悉,只是注释的方法有些不同,但得还是一步一步的来!没有基础的同学看了这篇随笔也会大有助益的! 什么是变量?所谓变量就是将一些运算的中间结果暂存到内存中,以便后续代码调用. 什么是常量?即一直不变的量. 给代码写上注释是养成一个好习惯,方便别人更好理解自己的代码. 由于Python是动态语言,所以赋值变量的时候不用指定数据类型就可以 变量命名规则 1.必须由数字,字母,下划线任意组合,且不能数字开头,不能有任何符号. 2.不能是python中的关键字.