变量
Python 中一切都是对象,Python 内置的类包含下面几种:
其中只有 list
, set
和 dict
三种类型是可以修改的,其他类型不能修改,比如下面的代码会引发错误:
a = '00000'
a[0] = '5'
内存分配
首先看下面的代码:
a = 5
b = 5
print(id(a) == id(b))
执行结果为 True
其中 id()
返回对象的唯一标识符,不同的标识符对应不同地址,但生命周期不重叠的变量的标识符可以相同。
也就是说变量 a
和变量 b
是指向同一内存地址的引用,这样做可以节省内存占用!
但这种方式只针对 不可变对象,可变对象的内存地址为变量的起始地址,值相同的可变对象的内存地址不同:
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))
print(id(b))
print(a is b) # False
结果为:
2789579689600
2787435232960
False
但通过变量的引用赋值得到的新的变量指向原来的内存地址:
a = []
b = a
print(id(a) == id(b)) # True
同样的,函数传参的时候,如果参数是 list, set 或 dict,传参的时候形参得到了变量引用,因此可以修改原始变量的值!
修改列表
可以通list类的方法修改列表,也可以通过运算符修改:
a = [1, 2, 3]
b = a
b.append(4)
print(a)
a = [1, 2, 3]
b = a
b += [4]
print(a)
a = [1, 2, 3]
b = a
b = b + [4]
print(a)
a = [1, 2, 3]
b = a
b = []
print(a)
上面代码的指向结果为:
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3]
后面两种方法没有修改原始列表内容的原因是后面两种方法 重新分配了列表 而不是修改原有的列表。
完结 🍻
如果想了解 C++ 的内存管理机制,可以参考 指针与内存管理