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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
image因为int类型是不可变类型,所有其实是j复制了一份到新的内存地址然后+1,然后j又指向了新的地址。所以j的内存id发生了变化
可变类型
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']
网友评论