您的位置:

Python可变对象和不可变对象详解

Python是一门非常强大的编程语言,具有很多独特的特性。其中一个特性就是Python中有可变对象和不可变对象的概念。对于初学者来说,可能不太理解这个概念,本篇文章旨在从不同的角度对Python可变对象和不可变对象进行详细阐述。

一、Python对象

在Python中,一切皆为对象。任何一个值都可以看作是一个对象。数值、字符串、列表、元组等常见的数据类型都是对象。

# 例子1
a = 1
b = "hello"
c = [1, 2, 3]
d = (1, 2, 3)

在上面的例子中,a、b、c、d都是Python对象。

二、可变对象和不可变对象

1. 不可变对象

不可变对象是指一旦创建就不能修改其值的对象。比较常见的不可变对象有数字、字符串、元组等。

# 例子2
a = 10
b = "hello world"
c = (1, 2, 3)

在上面的例子中,a、b、c都是不可变对象。

2. 可变对象

可变对象是指其值可以被修改的对象。比较常见的可变对象有列表、字典等。

# 例子3
a = [1, 2, 3]
b = {"name": "Tom", "age": 18}

在上面的例子中,a、b都是可变对象。

三、Python对象的赋值和传递方式

1. 赋值

当我们将一个对象赋给一个变量时,变量名就成为了一个指向该对象的引用。如果赋值的是不可变对象,那么该变量仅仅是将该对象的值复制给该变量,而不是指向该对象本身。如果赋值的是可变对象,那么该变量就会指向该对象本身。

# 例子4
a = 10
b = a

在上面的例子中,b是指向a所指向的对象10的引用。

# 例子5
a = [1, 2, 3]
b = a
b[0] = 4
print(a) #[4, 2, 3]
print(b) #[4, 2, 3]

在上面的例子中,a和b都指向同一个列表对象,因此修改b的同时,a也会发生改变。

2. 传递方式

Python中的参数传递都是按引用传递,这个引用就是指向一个对象的指针。

当参数是不可变对象时,相当于传递的是该对象的值。函数内部对参数的修改不会影响到函数外部传递的变量。

# 例子6
def func(a):
    a += 1
    print(a)
b = 1
func(b) #2
print(b) #1

当参数是可变对象时,函数内部对参数的修改会影响到函数外部传递的变量。

# 例子7
def func(a):
    a.append(4)
    print(a)
b = [1, 2, 3]
func(b) #[1, 2, 3, 4]
print(b) #[1, 2, 3, 4]

在上面的例子中,虽然b在函数内部被修改了,但是函数外部的b也发生了改变。

四、总结

Python中有可变对象和不可变对象的概念。不可变对象一旦创建就不能修改其值,比较常见的是数字、字符串、元组等。可变对象的值可以被修改,比较常见的是列表、字典等。Python中的参数传递都是按引用传递,当参数是不可变对象时,相当于传递的是该对象的值;当参数是可变对象时,函数内部对参数的修改会影响到函数外部传递的变量。