📜  Python中的可变对象与不可变对象(1)

📅  最后修改于: 2023-12-03 15:34:26.153000             🧑  作者: Mango

Python中的可变对象与不可变对象

在 Python 中,对象分为可变对象和不可变对象两种。不同之处在于对对象进行操作时,是否有改变对象的值或属性。

不可变对象

不可变对象在被创建后,其值和内存地址都不能被改变。

以下是 Python 中的不可变对象:

  • 数值型:int、float、complex
  • 字符串:str
  • 元组:tuple
示例
a = 1
print(id(a))  # 输出: 94573305760256
a = 2
print(id(a))  # 输出: 94573305760320

在上述示例中,a 是一个整型变量,首先它所指向的内存地址是 94573305760256。当 a 的值从 1 改变为 2 时,其实是创建了一个新的整型对象,并将 a 的指针指向这个新的对象的内存地址 94573305760320

可变对象

可变对象在被创建后,其值和大小都可以被改变。

以下是 Python 中的可变对象:

  • 列表:list
  • 集合:set
  • 字典:dict
示例
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_oneappend_one,分别对不可变对象和可变对象进行操作。接着定义了两个变量 ab,并在函数内部对其进行传参操作。

在函数 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