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基础#
全部评论

相关推荐

09-14 20:51
四川大学 Java
慢热的鲸鱼在学习:985加粗就行了,第二个项目来不及准备也没事,省的写了问你你还不会。你只需准备面试八股和项目场景,剩下的交给985。即使面不过也没事,面试经验是最重要的,你现在不缺时间
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务