Python之引用(可变与不可变数据类型)

本文探讨了Python中变量引用的行为差异,特别是在处理可变与不可变类型时。通过实例说明了数字与列表作为参数时的变化,并解释了字典如何处理不同类型的数据作为键。

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

一.引用

     当我们在使用调用函数时,可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?函数传递参数引用请点击详解

在Python中是没有指针的概念,但是我们要注意引用。

下面看一段代码:

>>> a=100
>>> b=a
>>> id(a)
507101952
>>> id(b)
507101952

这里我们可以发现a和b的地址是一摸一样的,Python与C语言不同,这样的分配方式节约空间,而在C语言中会分别给a和b分配两个不同的地址。但在Python中,当我们对其进行修改时,会怎样呢?

看下面的代码

>>> a=200
>>> b
100
>>> id(b)
507101952
>>> id(a)
507105152
>>> c=a
>>> id(c)
507105152
这里可以清晰的看出来在Python中,a和b的数值一样时,所以两个地址是一样的,当对a变量修改时,b的地址不会变,而是为修改的b变量重新分配一个唯一的标识即b地址改变。而当a赋值给c时,c的地址和改变后的b地址是一样的。下面看当变量是列表时,还会一样吗?
>>> A=[11,22]
>>> B=A
>>> id(A)
6467080
>>> id(B)
6467080
>>> A.append(33)
>>> A
[11, 22, 33]
>>> B
[11, 22, 33]
>>> id(A)
6467080
>>> id(B)
6467080
这时,我们发现A赋值给B,当A发生改变时,B也会跟着同样改变,且两者的地址并不会发生改变。这是为什么呢?在Python中,我们需要注意有分可变类型和不可变类型

可变类型:列表、字典

不可变类型:数字、字符串、元祖

因此,当我们企图对数字修改时,数字是属于不可变类型,于是,它重新分配地址,而对于列表,它属于可变类型,当我们进行修改时,便会在原来的地址处进行更改。

二.字典的存储

下面我们看一下字典与引用的关系,代码如下

>>> M={"score":100,(11,22):110,521:1314}
>>> M
{521: 1314, (11, 22): 110, 'score': 100}
>>> M={"score":100,(11,22):110,521:1314,[11,22]:88}

 Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    M={"score":100,(11,22):110,521:1314,[11,22]:88}
TypeError: unhashable type: 'list'
通过代码可以看出来,在字典中,键只能是不可变类型来担任,可变类型不可以是字典中的键,否则会报错。这是因为在字典中的存取是很特别的,是以哈希表的方式。字典中的每一个键都产生一个唯一的数值,而这个唯一的数值就会作为键对应的value的地址,当查找时,通过键就会很快找到对应的value;若键是可变数据类型,当键发生改变,就再也找不到对应的value,所以在字典中,不可变数据类型不能做键。



 























































































































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值