可变对象:list dict set; 列字集,可变。
不可变对象:tuple string int float bool
地址问题:
我们可以看到,可变对象变化后,地址是没有改变的
如果两个变量同时指向一个地址
可变变量:地址不变,对象同时改变
不可变变量:修改内容后地址也改变,另一个不可变变量地址内容都不变。
作为函数参数:
可变对象作为参数传入时,在函数中对其本身进行修改,是会影响到全局中的这个变量值的,因为函数直接对该地址的值进行了修改。
可变变量:我们可以看到,类中的变量和全局变量地址依然是共用的,无论在哪里修改都会影响对方。
对于不可变对象来说,虽然函数中的a值变了,但是全局中的a值没变,因为函数中的a值已经对应了另外一个地址,而全局中的a值指向的原来地址的值是没有变的。
def myfunc(l=[]):
l.append('add')
print(l)
myfunc([1, 2, 3])
[1, 2, 3, 'add']
myfunc(['a', 'b'])
['a', 'b', 'add']
---
myfunc()
['add']
myfunc()
['add', 'add']
myfunc()
['add', 'add', 'add']
按理说应该每次都是['add'],但是现在出现了意想不到的错误。
这是因为l = []是在函数定义时就确定下来的了,所以之后每次调用这个函数,使用的l都是同一个,如果不指定这个参数的新值,就会出现上面这个问题。
上面这个l可以默认设置为None,这就是一个不可变对象。