python可变和不可变对象
- 可变、不可变是指变量所引用的内存中的那块空间是否可以被改变。
- 当改变变量value时,变量原指定内存地址的值可以被改变,则为可变类型,否则为不可变类型。
- 改变value值的同时,使用id()函数查看变量id是否变化即可判断是什么类型。
不可变类型
不可变种类
- number,str,tuple,bool
- 当改变变量value时,重新分配一块内存空间,使变量指向新的地址。
指向不可变对象的变量改变value
a= "nightingale"
print(a, id(a))
a +="s"
print(a, id(a))
result:
nightingale 140139369457712
nightingales 140139369458352
# 变量引用的地址发生了变化,a引用了重新开辟了的新空间。
a = (1, 2, 3)
b = a
print(a, b, id(a),id(b))
a = a + (4,5)
print(a, b, id(a),id(b))
result:
(1, 2, 3) (1, 2, 3) 140446447493624 140446447493624
(1, 2, 3, 4, 5) (1, 2, 3) 140446446797488 140446447493624
可变类型
可变类型种类
指向可变对象的变量改变value
- 改变变量值,变量所引用的内存中的地址不会被改变,原地址中所存储的内容发生变化。
- 指向可变对象的变量直接重新赋值,则地址会发生改变。
- +=不重新创建对象,还在原地址上更改,+会重新创建对象。
a=[1,2,3]
print(a, id(a))
a+=[4,5,6]
print(a, id(a))
result:
[1, 2, 3] 140153179393544
[1, 2, 3, 4, 5, 6] 140153179393544
# +=在原地址更改内容
a=[1,2,3]
print(a, id(a))
a=[4,5,6]
print(a, id(a))
result:
[1, 2, 3] 140325380423176
[4, 5, 6] 140325581106376
# 直接赋值,重新创建对象,原变量引用地址发生改变。
a = [1, 2, 3]
b = a
print(a, b, id(a),id(b))
a = a + [4, 5]
print(a, b, id(a),id(b))
result:
[1, 2, 3] [1, 2, 3] 139918170480072 139918170480072
[1, 2, 3, 4, 5] [1, 2, 3] 139918191472200 139918170480072
# +重新创建对象
[1, 2, 3] [1, 2, 3] 140366083399112 140366083399112
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] 140366083399112 140366083399112
result:
a = [1, 2, 3]
b = a
print(a, b, id(a),id(b))
a += [4, 5]
print(a, b, id(a),id(b))
def test(age, name):
print("test-1", age, name, id(age), id(name))
age = 28
name = "Jack"
print("test-2", age, name, id(age), id(name))
age = 13
name = "Mick"
print(age, name, id(age), id(name))
test(age, name)
print(age, name, id(age), id(name))
result:
13 Mick 140661410359584 140661412089392
test-1 13 Mick 140661410359584 140661412089392
test-2 28 Jack 140661410360064 140661208499904
13 Mick 140661410359584 140661412089392