📅  最后修改于: 2023-12-03 15:34:26.153000             🧑  作者: Mango
在 Python 中,对象分为可变对象和不可变对象两种。不同之处在于对对象进行操作时,是否有改变对象的值或属性。
不可变对象在被创建后,其值和内存地址都不能被改变。
以下是 Python 中的不可变对象:
a = 1
print(id(a)) # 输出: 94573305760256
a = 2
print(id(a)) # 输出: 94573305760320
在上述示例中,a
是一个整型变量,首先它所指向的内存地址是 94573305760256
。当 a
的值从 1
改变为 2
时,其实是创建了一个新的整型对象,并将 a
的指针指向这个新的对象的内存地址 94573305760320
。
可变对象在被创建后,其值和大小都可以被改变。
以下是 Python 中的可变对象:
a = [1, 2, 3]
print(id(a)) # 输出: 140646901815552
a.append(4)
print(id(a)) # 输出: 140646901815552
在上述示例中,a
是一个列表对象,首先它所指向的内存地址是 140646901815552
。当往列表 a
中添加一个元素 4
时,其原有的内存地址未发生改变,a
仍然指向 140646901815552
,但对象的大小变大了。
Python 的函数参数传递有两种方式:传值(传递对象的副本)和传引用(传递对象的指针)。
对于不可变对象,在函数内对它进行赋值等修改操作时,都会生成一个新的对象,而原对象的值并不会改变。
对于可变对象,在函数内修改对象的值或属性时,原对象的值会发生改变。
def add_one(a: int):
print(f"id(a) before: {id(a)}")
a = a + 1
print(f"id(a) after: {id(a)}")
def append_one(a: list):
print(f"id(a) before: {id(a)}")
a.append(1)
print(f"id(a) after: {id(a)}")
a = 1
print(f"id(a) before: {id(a)}")
add_one(a)
print(f"id(a) after: {id(a)}")
b = [1, 2, 3]
print(f"id(b) before: {id(b)}")
append_one(b)
print(f"id(b) after: {id(b)}")
在上述示例中,首先定义了两个函数 add_one
和 append_one
,分别对不可变对象和可变对象进行操作。接着定义了两个变量 a
和 b
,并在函数内部对其进行传参操作。
在函数 add_one
内,对参数 a
进行了赋值操作,其值由原先的 1
变为 2
。然而,由于整型为不可变对象,因此在函数内部为 a
生成了一个新的对象,其内存地址与原先不同。
在函数 append_one
内,对参数 a
进行了 append
操作,向其中添加了一个元素。由于列表为可变对象,因此原先的列表对象 b
发生了改变,其内存地址保持不变。
输出结果为:
id(a) before: 94573305760256
id(a) after: 94573305760288
id(a) before: 140646901815552
id(a) after: 140646901815552
id(b) before: 140646901815552
id(b) after: 140646901815552