python可变类型与不可变类型

2018-12-13  本文已影响0人  数据工程师从入门到放弃

python可变类型与不可变类型

[TOC]

不可变类型

#不可变类型

int,string,float,tuple

def int_test(): 
    i = 77
    j = 77
    print(id(77))                  #140396579590760
    print('i id:' + str(id(i)))      #i id:140396579590760
    print('j id:' + str(id(j)))      #j id:140396579590760
    print i is j                    #True
    j = j + 1 #此时 已经新开辟了内存区间
    print('new i id:' + str(id(i)))  #new i id:140396579590760
    print('new j id:' + str(id(j)))  #new j id:140396579590736
    print i is j                    #False

if __name__ == '__main__':
    int_test()

作者:炸鸡叔
链接:https://www.jianshu.com/p/c5582e23b26c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

因为int类型是不可变类型,所有其实是j复制了一份到新的内存地址然后+1,然后j又指向了新的地址。所以j的内存id发生了变化

image

可变类型

dict,list

def dict_test():
    a = {}
    b = a
    print(id(a))
    b['a'] = 'hhhh'
    print('id a:' + str(id(a)))
    print('a:' + str(a))
    print('id b:' + str(id(b)))
    print('b:' + str(b))

if __name__ == '__main__':
    dict_test()


140367329543360

id a:140367329543360

a:{'a': 'hhhh'}

id b:140367329543360

b:{'a': 'hhhh'}

image

python函数参数传递

由于python规定参数传递都是传递引用,也就是传递给函数的是原变量实际所指向的内存空间

当传过来的是可变类型(list,dict)时,我们在函数内部修改就会影响函数外部的变量。

而传入的是不可变类型时在函数内部修改改变量并不会影响函数外部的变量

即为什么函数默认参数要用元组而非列表


def test(a_int, b_list):
    a_int = a_int + 1
    b_list.append('13')
    print('inner a_int:' + str(a_int))#6
    print('inner b_list:' + str(b_list))#[10,11,'13']

if __name__ == '__main__':
    a_int = 5
    b_list = [10, 11]

    test(a_int, b_list)

    print('outer a_int:' + str(a_int))#5
    print('outer b_list:' + str(b_list))#[10,11,'13']

上一篇下一篇

猜你喜欢

热点阅读