这里说的是python3.
可变类型与不可变类型指的是数据类型,不是变量类型.
python3变量都是引用类型,不用声明类型,赋值时就被创建,其内存空间只是保存了所指向数据的内存地址.
标准数据类型
Python3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
Python3 的六个标准数据类型中:
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)
1.不可变数据:
a = 9
b = a
print('before:')
print(id(a), a)
print(id(b), b)
b = 8
print('after:')
print(id(a), a)
print(id(b), b)
结果:
before:
1356492048 9
1356492048 9
after:
1356492048 9
1356492016 8
变量a,b都是引用类型,都保存不可变数据9的地址1356492048 ;
改变b时,9是不可变数据,只能让b指向新不可变数据8的地址1356492016,a依然保存 不可变数据9的地址1356492048.
2.不可变数据做参数:
a = 9
print('main', id(a), a)
add(a)
print('main', id(a), a)
def add(parameter):
parameter += 1
print('add', id(parameter), parameter)
结果:
main 1356492048 9
add 1356492080 10
main 1356492048 9
同上b = a,参数parameter也指向9,修改parameter后,由于9不可变,parameter指向10,a中存储的地址仍为9的地址.
3.可变数据:
list_a = [1,3,4]
list_b = list_a
print('before:')
print(id(list_a), list_a)
print(id(list_b), list_b)
list_a.append(5)
print('after:')
print(id(list_a), list_a)
print(id(list_b), list_b)
结果:
before:
338998536 [1, 3, 4]
338998536 [1, 3, 4]
after:
338998536 [1, 3, 4, 5]
338998536 [1, 3, 4, 5]
list-a和list_b都指向[1,3,4],修改[1,3,4]后,可变数据[1,3,4]本身改变为[1,3,4,5]而不是重新创建数据[1,3,4,5]让list_b指向新数据,ist-a和list_b依然指向338998536 .
4.可变数据做参数:
list_a = [1,3,4]
print('main', id(list_a), list_a)
append(list_a)
print('main', id(list_a), list_a)
change(list_a)
print('main', id(list_a), list_a)
def append(parameter):
parameter.append(5)
print('add', id(parameter), parameter)
def change(parameter):
parameter = [2,4,6]
print('add', id(parameter), parameter)
结果:
main 338735944 [1, 3, 4]
add 338735944 [1, 3, 4, 5]
main 338735944 [1, 3, 4, 5]
add 338735560 [2, 4, 6]
main 338735944 [1, 3, 4, 5]
append(parameter)方法同上parameter = list_a,修改可变数据[1,3,4]为[1,3,4,5]后都改变;
change(parameter)方法等同parameter = list_a;parameter = [2,4,6],parameter存储[2,4,6]地址,而list_a仍然存储[1,3,4,5]地址.
由于常跟c#语言弄混,记录一下方便参考.