可变对象与不可变对象
可变对象:集合、字典、列表
不可变对象:字符串、元组、数字
区别:
- 可变对象内容修改,对象的内存地址不会被改变
- 不可变对象内容修改,对象的内存地址会改变
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
>>> a
20
- 可变对象的参数传递
当函数传递的是可变对象时,函数内改变其值,会影响函数外的变量(因为变量指向的是同一个内存地址)
def test_define(dicts, sets, lists):
lists = lists
dicts['age'] = 24
sets.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
"""