首先简单介绍下两种数据类型
值类型
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] |
|