它们在需要常量哈希值的地方起着重要作用,例如作为字典中的键
从内存角度出发说下有什么区别?
不可变对象:
可变对象:
变的是:原来对象的内容,不会创建新对象,而变量也还是指向原对象
a = 123 b = a print(id(a)) print(id(b)) print(a, b) a += 2 print(id(a)) print(id(b)) print(a, b) # 输出结果 4473956912 4473956912 123 123 4473956976 4473956912 125 123
可以看看下面的图
首先,这是一个内存区域
原理:
a = "test" b = a print(id(a)) print(id(b)) print(a, b) a += "123" print(id(a)) print(id(b)) print(a, b) # 输出结果 4455345392 4455345392 test test 4455818288 4455345392 test123 test
a = (1, 2, 3) b = a print(id(a)) print(id(b)) print(a, b) a = a + a print(id(a)) print(id(b)) print(a, b) # 输出结果 4455410240 4455410240 (1, 2, 3) (1, 2, 3) 4455359200 4455410240 (1, 2, 3, 1, 2, 3) (1, 2, 3)
# 列表 a = [1, 2, 3] b = a print(id(a)) print(id(b)) print(a, b) a += [4, 5, 6] print(a, b) print(id(a)) print(id(b)) # 输出结果 4327665856 4327665856 [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] 4327665856 4327665856
能看到 a 变量修改值之后,b 的值也随之修改了
可以看看下面的图
这里先提前讲下函数的入门,因为参数传递是个挺重要的点
概念:
# 函数 def test_no_define(age, name): age = 123 name = "poloyy" print(age, name) age = 1 name = "yy" print(age, name) test_no_define(age, name) print(age, name) # 输出结果 1 yy 123 poloyy 1 yy
# 函数 def test_define(dicts, sets): dicts['age'] = 24 sets.pop() print(dicts, sets) dicts = {"age": 123} sets = {1, 2} print(dicts, sets) test_define(dicts, sets) print(dicts, sets) # 输出结果 1 yy {'age': 123} {1, 2} {'age': 24} {2} {'age': 24} {2}
总结: