python赋值与引用以及可变与比不可变数据

问题一:
>>> a={"b":3,"c":4}
>>> b=a
>>> print b
{'c': 4, 'b': 3}
>>> print a
{'c': 4, 'b': 3}
>>> b=a
>>> b["b"]=5
>>> print a
{'c': 4, 'b': 5}
>>> id(b)
39479880L
>>> id(a)
39479880L
>>> b
{'c': 4, 'b': 5}
>>> b=1
>>> print b
1
>>> print a
{'c': 4, 'b': 5}
>>> id(b)
39300024L

仔细看一下上面的问题,发现如果是b=1的话,原来的字典a不改变,b重新赋值了,如果b[“b”]=5时,a的值又会改变。为什么同样的赋值且会有不同的结果。在python中,一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的。例如,[]是一个空列表对象,变量 a 是该对象的一个引用。其中b=1 其实就是变量b重新引用了另一个值。但a变量指向是不变的。但后面的b[“b”],改变的是指向的对象的值,当然这个前提是这个对象可改变,但原本b的第一层内存地址还是跟a的地址指向是一致的。所以最终也会改到a的值。

问题二:


>>> c=3
>>> bb=3
>>> id(c)
39299976L
>>> id(bb)
39299976L
>>> a={"b":3,"c":4}
>>> cc={"b":3,"c":4}
>>> id(a)
44966904L
>>> id(cc)
39479880L

赋值相同的数字,引用的时同个地址,赋值相同的字典,为什么是不同的地址。
这是因为python已经创建好了小整数对象池,[-5~256],都是固定的地址。如果数据超过这个范围就是不同的地址。比如赋值个257.结果就不同。如果最后cc=a。那地址就一样了。因为两者指向了同一个对象。

问题三:
>>> a=[1,2]
>>> b=a
>>> a=a+[3,4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2]
>>> id(a)
45451400L
>>> id(b)
45014408L
>>> a=[1,2]
>>> b=a
>>> a+=[3,4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> id(a)
45450184L
>>> id(b)
45450184L
>>>

python中 +=与=+ 不一样。=+ 先创建的a+b的对象放入内存,然后变量a指向了a+b的对象,这事实上已经改变了a原本的指向,指向了新的地址。+=是改变了对象的值,但不改变引用。

以下是常用的数据类型:
原子类型:对象只能保存一个值,Python中没有字符类型,也就是没有字符的概念,因此,把字符串归为原子类型
容器类型:可以保存多个值

数据类型 存储模型 更新模型 访问模型
数据 原子类型 不可更改 直接访问
字符串 原子类型 不可更改 顺序访问
列表 容器类型 可更改 顺序访问
元组 容器类型 不可更改 顺序访问
字典 容器类型 可更改 顺序访问

python中一切皆为对象,包括整数,浮点数,布尔值
对象有三个事:

类型 (type)
身份(id)

如果有人问你,元组是严格不变的,你怎么回答?

元组可变与不可变属性:
元组不可变指的是类型以及id,但元组内如果有列表等可变对象,元组的值是可以变的,这个角度说,元组又是可变的。
python中所说的可变与不可变全部说的id(内存地址)

发布了34 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LANNY8588/article/details/103338961