Python3 不可变和可变数据类型

译者:anxin
日期:2018-06-12

Python 3 中数据类型分为不可变数据类型和可变数据类型。不可变数据类型是其对象初次赋值后,对象的值是不能再被修改,如果对对象再一次赋值,那么将为对象重新分配内存空间,并为对象赋值,然后返回对象。可变数据类型是对其对象初次赋值后,还可以修改其对象的值,不会造成重新分配内存,并创建新对象。

Python3 不可变数据类型

Python3 中如下数据类型是不可变数据类型

Python3 可变数据类型

Python3 中如下数据类型是可变数据类型

Python3 如何查看数据类型是可变或不可变

查看 Python3 的数据类型是可变数据类型或是不可变数据类型,需要用到两个 Python3 内置函数:id()type() 和一个运算符 isid() 函数用于获取对象的位置标示符(即:内存地址),type() 函数用于获取对象的数据类型;is 运算符用于比较两个对象是否是引用同一个对象。

以下实例查看整数类型是不可变数据类型:

#!/usr/bin/env python3

#测试数字类型是不可变类型
int_1 = 10
int_2 = 10

print("修改前 int_1 的内存地址:", id(int_1))
print("无修改 int_2 的内存地址:", id(int_2))
print("int_1 的数据类型:", type(int_1))

#查看是否是同一对象
if int_1 is int_2:
    print("是同一对象")
else:
    print("不是同一对象")
    
int_1 = 20
print("修改后 int_1 的内存地址:", id(int_1))
print("无修改 int_2 的内存地址:", id(int_2))
print("修改后 int_1 值:", int_1)

#查看是否是同一对象
if int_1 is int_2:
    print("是同一对象")
else:
    print("不是同一对象")

如上 Python3 脚本的输出结果是:

修改前 int_1 的内存地址: 94543161876384
无修改 int_2 的内存地址: 94543161876384
int_1 的数据类型: <class 'int'>
是同一对象
修改后 int_1 的内存地址: 94543161876704
无修改 int_2 的内存地址: 94543161876384
修改后 int_1 值: 20
不是同一对象

注:如上你可能已经注意到,当创建两个变量的值相同时,它们的内存地址相同,其实是后创建的变量是先创建的变量的别名。这样能够减少内存的使用。

Python3 中所有的数据类型,不论是可变还是不可变都可以按照如上的方法测试。

Python3 对象如何传递到函数内

Python3 的所有数据类型(包括可变和不可变数据类型)的对象在作为参数传递给函数时,它们传递的都是对象的内存地址。

Python3 值传递

不可变数据类型的参数传递方式称为值传递:即便传递到函数内的是对象的内存地址,但是参数不可修改,对参数修改后将重新构造一个参数,所以其实际作用是传递给参数一个值。

不可变类型的值传递实例:

#!/usr/bin/env python3

def update_func(var):
    print("var 的内存地址:", id(var))
    var += 10

int_1 = 10
print("int_1 的内存地址:", id(int_1))
update_func(int_1)
print("int_1 传递参数后的值:", int_1)

如上实例的输出结果:

int_1 的内存地址: 94634058694560
var 的内存地址: 94634058694560
int_1 传递参数后的值: 10

传递参数后,输出变量的地址相同,但是修改参数的值,不会影响原值。

Python3 引用传递

可变数据类型的参数传递方式称为引用传递:传递到函数内的是对象的内存地址,但是参数可修改,对参数的修改就是对原数据的修改,所以其实际作用是传递给参数一个引用。

不可变类型的值传递实例:

#!/usr/bin/env python3

def update_func(var):
    print("var 的内存地址:", id(var))
    var += [4]

lst_1 = [1, 2, 3]
print("lst_1 的内存地址:", id(lst_1))
update_func(lst_1)
print("lst_1 传递参数后的值:", lst_1)

如上实例的输出结果:

lst_1 的内存地址: 140712169517576
var 的内存地址: 140712169517576
lst_1 传递参数后的值: [1, 2, 3, 4]

传递参数后,输出变量的地址相同,但是修改参数的值,会影响原值。 

本文链接:/tutorial/python3/Python3-kebian-bukebian-shuju-leixing

本文版权归知站所有,未经站长同意不得转载,谢谢尊重作者劳动成果!