Python 可变与不可变

可变对象: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,这就是一个不可变对象。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容