首先简单介绍下两种数据类型
值类型
int str bool
引用类型
list set tuple dict
值类型的变量,堆里放着该变量的值。 引用类型的变量,堆里放着一个地址,该地址指向放着该变量的值,值放在栈里。
python函数如何传递参数
(1) 改变值类型
def change(i):
i = i + 1
print(i)
int0 = 0
change(int0)
print(int0)
传参时, int0 跟i 是相同的, 计算i+1 时, int0 跟i 也是相同的, 但int0 跟i+1 是不同的
| int0 | i | i+1 |
---|
堆 | id:ID0,value:0 | id:ID0,value:0 | id:ID1,value:1 |
得到i+1 等于1 之后, 要将1 复制给i , 此时是将i 的地址做了更改, 新的地址上的值是1
| int0 | i |
---|
堆 | id:ID0,value:0 | id:ID1,value:1 |
(2) 改变引用类型(a)
def change(lst):
lst[0] = 1
print(lst)
list0 = [0, 1]
change(list0)
print(list0)
传参时, list0 跟lst 是相同的
| list0 | lst |
---|
堆 | id:ID0,value:id_a | id:ID0,value:id_a | 栈 | id:id_a,value:[0,1] | id:id_a,value:[0,1] |
lst[0]=1 改变参数值, lst[0] 是在栈里修改数值, 地址并没有发生改变
| list0 | lst |
---|
堆 | id:ID0,value:id_a | id:ID0,value:id_a | 栈 | id:id_a,value:[0,1] | id:id_a,value:[1,1] |
(3) 改变引用类型(b)
def change(lst):
lst = [3, 4]
print(lst)
list0 = [0, 1]
change(list0)
print(list0)
传参时, list0 跟lst 是相同的
| list0 | lst |
---|
堆 | id:ID0,value:id_a | id:ID0,value:id_a | 栈 | id:id_a,value:[0,1] | id:id_a,value:[0,1] |
要将[3,4] 复制给lst , 此时是将lst 的地址做了更改, 新的地址上的值是[3,4]
| list0 | lst |
---|
堆 | id:ID0,value:id_a | id:ID1,value:id_b | 栈 | id:id_a,value:[1,1] | id:id_b,value:[3,4] |
|