1. 值类型和引用类型的概念
在Python中,所有的数据都可以被分为值类型和引用类型。
值类型是指数据在内存中直接存储其值的类型,比如数字、字符串、布尔值等。当我们给一个值类型的变量赋值给另一个变量时,实际上是将当前变量的值复制一份给新的变量。
a = 10
b = a
a = 20
print(a) # 输出 20
print(b) # 输出 10
引用类型是指数据在内存中存储地址的类型,比如列表、字典、对象等。当我们给一个引用类型的变量赋值给另一个变量时,实际上是将当前变量的引用复制一份给新的变量。
alist = [1, 2, 3]
blist = alist
alist.append(4)
print(alist) # 输出 [1, 2, 3, 4]
print(blist) # 输出 [1, 2, 3, 4]
2. 值类型和引用类型的区别
2.1 赋值行为
从上面的例子中可以看出,值类型的赋值实际上是创建了一个新的变量并复制值,而引用类型的赋值只是创建了一个新的引用,并没有复制实际的数据。
2.2 修改行为
当我们修改一个值类型的变量时,不会影响到其他变量。
a = 10
b = a
a = 20
print(a) # 输出 20
print(b) # 输出 10
当我们修改一个引用类型的变量时,会影响到所有引用该数据的变量。
alist = [1, 2, 3]
blist = alist
alist.append(4)
print(alist) # 输出 [1, 2, 3, 4]
print(blist) # 输出 [1, 2, 3, 4]
通过这个例子可以看出,修改alist的同时也修改了blist,因为它们引用的是同一个列表。
2.3 函数传参
在Python中,函数的参数传递也会受到值类型和引用类型的影响。
当我们将一个值类型的变量作为参数传递给函数时,函数内部修改该参数的值不会影响到外部的变量。
def modify_value(num):
num = 20
a = 10
modify_value(a)
print(a) # 输出 10
当我们将一个引用类型的变量作为参数传递给函数时,函数内部修改该参数的值会影响到外部的变量。
def modify_list(lst):
lst.append(4)
alist = [1, 2, 3]
modify_list(alist)
print(alist) # 输出 [1, 2, 3, 4]
可以看到,modify_list函数内部的修改影响了外部的alist列表。
3. 总结
值类型和引用类型的区别在于赋值行为、修改行为和函数传参时的表现。
值类型的赋值是复制当前变量的值,修改一个变量不会影响到其他变量。引用类型的赋值是复制当前变量的引用,修改一个变量会影响到其他引用该数据的变量。
在函数传参时,值类型的参数不会受到函数内部修改的影响,但引用类型的参数会受到函数内部修改的影响。