python中,万物皆对象
python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址
python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象。
不可变类型
>>>a = 1 #将名字a与内存中值为1的内存绑定在一起
>>>a = 2 #将名字a与内存中值为2的内存绑定在一起,而不是修改原来a绑定的内存中的值,这时,内存中值为1的内存地址引用计数-1,当引用计数为0时,内存地址被回收
>>>b = a #变量b执行与a绑定的内存
>>>b = 3 #创建一个内存值为3的内存地址与变量名字b进行绑定。这是a还是指向值为2的内存地址。
>>>a,b
>>>(2,3)
>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True
因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。
总结一下,不可变对象的优缺点。
优点是,这样可以减少重复的值对内存空间的占用?。
缺点呢,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。
可变类型
>>>a = [1]
>>>b = a #由于列别是可变对象类型,所以传递的时候,与变量名d绑定的内存地址与a绑定的内存地址是同一地址,内存里的值是[1]
>>>b[0] = 2
>>>a
[2]
def mutable(b = []): #函数使用了缺省变量
b.append(0)
return b
>>>mutable()
[0]
>>>mutable()
[0,0]
>>>mutable()
[0,0,0]
这里连续三次以缺省值,运行函数3次,每次的结果都不一样,就是由于可变类型list导致的。