一.引用
当我们在使用调用函数时,可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?函数传递参数引用请点击详解
在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,所以在字典中,不可变数据类型不能做键。