可变对象与不可变对象

可变对象:集合、字典、列表
不可变对象:字符串、元组、数字

区别:

  • 可变对象内容修改,对象的内存地址不会被改变
  • 不可变对象内容修改,对象的内存地址会改变

tips:不可变对象中的”变”:改变了值,会创建新的对象,改变了对象引用,指向了新对象,旧对象会被垃圾回收。

  1. # 不可变对象
  2. >>> a = 'test'
  3. >>> b = a
  4. >>> print(id(a), id(b))
  5. 140272000215280 140272000215280
  6. >>> b += 'test'
  7. >>> b
  8. 'testtest'
  9. >>> print(id(a), id(b))
  10. 140272000215280 140272000215088
  11. # 可变对象
  12. >>> a = [1, 4, 4]
  13. >>> b = a
  14. >>> b.append(33)
  15. >>> print(id(a), id(b))
  16. 140271999523808 140271999523808

函数中的参数传递

  1. 不可变对象的参数传递

当函数传递的参数是不可变对象时,函数内改变其值,不会影响函数外的变量(因为指向的是不同的内存地址)

  1. >>> def test_a(a):
  2. ... a = 26
  3. ... print(a)
  4. ...
  5. >>> a = 20
  6. >>> test_a(a)
  7. 26
  8. >>> a
  9. 20
  1. 可变对象的参数传递

当函数传递的是可变对象时,函数内改变其值,会影响函数外的变量(因为变量指向的是同一个内存地址)

  1. def test_define(dicts, sets, lists):
  2. lists = lists
  3. dicts['age'] = 24
  4. sets.pop()
  5. print(dicts, sets, lists)
  6. print(id(dicts), id(sets), id(lists))
  7. dicts = {"age": 123}
  8. sets = {1, 2}
  9. lists = [3, 4, 4]
  10. print(dicts, sets, lists)
  11. print(id(dicts), id(sets), id(lists))
  12. test_define(dicts, sets, lists)
  13. print(dicts, sets, lists)
  14. print(id(dicts), id(sets), id(lists))
  15. """
  16. {'age': 123} {1, 2} [3, 4, 4]
  17. 140280589689232 140280589978032 140280559383008
  18. {'age': 24} {2} [3, 4, 4]
  19. 140280589689232 140280589978032 140280559383008
  20. {'age': 24} {2} [3, 4, 4]
  21. 140280589689232 140280589978032 140280559383008
  22. """