python传递方式

python传递方式

变量、引用、对象

1、变量,通过变量指针引用对象,变量指针指向具体对象的内存空间,取对象的值。

2、对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)

3、变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。

可变对象和不可变对象

Python 在 heap 中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如 list。而不可变的对象则相反,表示其内容不可变。

不可变对象 :int,string,float,tuple   -- 可理解为C中,该参数为值传递
可变对象   :list,dictionary           -- 可理解为C中,该参数为指针传递

对于不可变对象,

在内存其实是唯一存在的,不同的变量名只是不同的引用,指向同一块内存;

对于可变对象,

就算内存中的数据一样也会重新开辟新的内存存放相同的内容。

如:

l1=[1,2,3]
l2=[1,2,3]
a=1
b=1
print(id(l1))
print(id(l2))
print(id(a))
print(id(b))
# id()函数返回对象的唯一标识符,标识符是一个整数。可以理解为id()函数用于获取对象的内存地址。
mem add: 10943008
reass mem add: 10943008
reass mem add: 10943040
mem add: 10943008

也就是说:

1、Python缓存了整数和短字符串这些不可变对象,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值语句,也只是创造新的引用,而不是对象本身;

2、Python没有缓存长字符串、列表及其他对象这些可变对象,可以由多个相同的对象,可以使用赋值语句创建出新的对象。
3、在python中,不可变对象是共享的,创建可变对象永远是分配新地址

值传递和引用传递

1、值传递

def reassign(int_a):
    print('start fun mem add: {}'.format(id(int_a)))
    int_a = 2
    print('reass mem add: {}'.format(id(int_a)))
    return None

if __name__ == '__main__':
    int_a = 1
    print('mem add: {}'.format(id(int_a)))
    reassign(int_a)
    print('mem add: {}'.format(id(int_a)))
    print(int_a)
mem add: 10943008
reass mem add: 10943008
reass mem add: 10943040
mem add: 10943008
def reassign(list_a):
    print('start fun mem add: {}'.format(id(list_a)))
    list_a = [2]
    print('reass mem add: {}'.format(id(list_a)))
    return None

if __name__ == '__main__':
    list_a = [1]
    print('mem add: {}'.format(id(list_a)))
    reassign(list_a)
    print('mem add: {}'.format(id(list_a)))
    print(list_a)
mem add: 139900071267144
start fun mem add: 139900071267144
reass mem add: 139900071267208
mem add: 139900071267144
[1]

2、引用传递

def append(list_a):
    print('start fun mem add: {}'.format(id(list_a)))
    list_a.append(2)
    print('reass mem add: {}'.format(id(list_a)))
    return None

if __name__ == '__main__':
    list_a = [1]
    print('mem add: {}'.format(id(list_a)))
    append(list_a)
    print('mem add: {}'.format(id(list_a)))
    print(list_a)
mem add: 139775496346376
start fun mem add: 139775496346376
reass mem add: 139775496346376
mem add: 139775496346376
[1, 2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值