Python 可变类型与不可变类型

这里说的是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#语言弄混,记录一下方便参考.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值