Python学习笔记(一)| 可变 vs 不可变数据类型
可变数据类型
不分配新地址,直接原地修改原对象。
lst = [1, 2] print(id(lst)) lst.append(3) print(id(lst)) # 地址不变 print(lst) # [1, 2, 3]
d = {'a': 1}
print(id(d))
d['b'] = 2
print(id(d)) # 地址不变
print(d) # {'a': 1, 'b': 2}
s = {1, 2}
print(id(s))
s.add(0)
print(id(s)) # 地址不变
print(s) # {0, 1, 2}
ba = bytearray(b'abc') print(id(ba)) ba[0] = 98 # b的ASCII码 print(id(ba)) # 地址不变 print(ba) # bytearray(b'bbc')
class Person:
name = 'Bob'
p = Person()
print(p.name) # Bob
p.name = 'Alice' # 属性可变
print(p.name) # Alice
不可变数据类型
修改时创建新对象,不改变原对象。所谓创建新对象,就是在存储空间中分配新地址,存入新数据。
a = 10 print(id(a)) # 原地址-> 140721006838984 a += 2 print(id(a)) # 新地址-> 140721006839048
浮点数, 布尔值,字符串同理
b = 1.2 b += 0.3 print(b) # 1.5
f = True f = False print(f) # False
s = "hello" s += "!" print(s) # hello!
t = (1, [2, 3]) # t[0] = 2 # TypeError t[1].append(4) print(t) # (1, [2, 3, 4]) tt = (4,) new_t = t + tt print(new_t) # (1, [2, 3, 4], 4)
b = b'abc' # b[0] = 98 # TypeError new_b = b.replace(b'a', b'x') print(new_b) # b'xbc' print(b)# b'abc'
实战案例
def modify(num, items):
num += 5 # 创建新对象(不影响实参)
items.append(3) # 原地修改(影响实参)
n = 5
lst = [1, 2]
modify(n, lst)
print(n) # 5
print(lst) # [1, 2, 3]
def foo(a=[]):
a.append(1)
return a
print(foo()) # 输出[1]
print(foo()) # 输出[1, 1]
valid_key = (1, "a") # 元组(不可变)可作键
invalid_key = [1, 2] # 列表(可变)不可作键
d = {}
d[valid_key] = 2
# d[invalid_key] = 3 # TypeError
print(d) # {(1, "a") : 2}
#python基础#
查看14道真题和解析