可变对象与不可变对象
可变对象:集合、字典、列表
不可变对象:字符串、元组、数字
区别:
- 可变对象内容修改,对象的内存地址不会被改变
- 不可变对象内容修改,对象的内存地址会改变
tips:不可变对象中的”变”:改变了值,会创建新的对象,改变了对象引用,指向了新对象,旧对象会被垃圾回收。
# 不可变对象>>> a = 'test'>>> b = a>>> print(id(a), id(b))140272000215280 140272000215280>>> b += 'test'>>> b'testtest'>>> print(id(a), id(b))140272000215280 140272000215088# 可变对象>>> a = [1, 4, 4]>>> b = a>>> b.append(33)>>> print(id(a), id(b))140271999523808 140271999523808
函数中的参数传递
- 不可变对象的参数传递
当函数传递的参数是不可变对象时,函数内改变其值,不会影响函数外的变量(因为指向的是不同的内存地址)
>>> def test_a(a):... a = 26... print(a)...>>> a = 20>>> test_a(a)26>>> a20
- 可变对象的参数传递
当函数传递的是可变对象时,函数内改变其值,会影响函数外的变量(因为变量指向的是同一个内存地址)
def test_define(dicts, sets, lists):lists = listsdicts['age'] = 24sets.pop()print(dicts, sets, lists)print(id(dicts), id(sets), id(lists))dicts = {"age": 123}sets = {1, 2}lists = [3, 4, 4]print(dicts, sets, lists)print(id(dicts), id(sets), id(lists))test_define(dicts, sets, lists)print(dicts, sets, lists)print(id(dicts), id(sets), id(lists))"""{'age': 123} {1, 2} [3, 4, 4]140280589689232 140280589978032 140280559383008{'age': 24} {2} [3, 4, 4]140280589689232 140280589978032 140280559383008{'age': 24} {2} [3, 4, 4]140280589689232 140280589978032 140280559383008"""
