Python:值传递,引用传递?不存在的,是赋值传递

Python的变量及其赋值

c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的?

a = 1
b = a
print(id(a),id(b)) #140723344823328 140723344823328.

此时,变量a与变量b指向同一对象
变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
  
接着

a = a + 1
print(b) #1

由于整型变量(int),字符串(string)都是不可类型,a = a + 1 会创建一个值为2的新对象,并用a指向它。
因此,b指向的还是1这个对象。 【对于不可变对象(字符串,整型,元祖等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。】
  
列表的例子

可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
l1 = [1, 2, 3]
l2 = l1
l1.append(4)
print(l1) #[1, 2, 3, 4]
print(l2) #[1, 2, 3, 4]

由于l1是可变类型,因此l1.append(4)不会创建新对象,会在原列表中插入4,而l1与l2都是指向这个列表,所以值都为[1,2,3,4]

变量可以删除,但对象无法被删除。

l = [1, 2, 3]
del l #l被删除,对象[1,2,3]仍然存在

Python 函数的参数传递

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def my_func1(b):
    b = 2

a = 1
my_func1(a)
print(a) #1

这里参数传递后 b与a 同时指向 值为1这个对象,接着b=2,系统建立2这个对象,并把b指向2,因此a还是指向值为1的对象

  1. return让 a 指向 b指向的 值为2的对象
def my_func2(b):
    b = 2
    return b

a = 1
a = my_func2(a)
print(a) #2
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def my_func3(l2):
    l2.append(4)

l1 = [1, 2, 3]
my_func3(l1)
print(l1) #[1, 2, 3, 4]

l2与l1都指向[1,2,3]这个列表对象,列表是可变类型,列表对象的值修改后并不会重新创建一个新对象,指向这个对象的l1的值也相应变为[1,2,3,4]

def my_func4(l2):
    l2 = l2 + [4]

l1 = [1, 2, 3]
my_func4(l1)
print(l1)#[1, 2, 3]

l2=l2+[4] 会创建一个新的列表对象[1,2,3,4]并把l2指向这个新对象,因此l1不会受影响

5)如果想把l1也指向新对象,则可以用return

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def my_func5(l2):
    l2 = l2 + [4]
    return l2

l1 = [1, 2, 3]
l1 = my_func5(l1)
print(l1) #[1, 2, 3, 4]

第3)与第5的作用是一样的,但实际中一般会使用return语句,语义会更加清晰

总结

Python中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递,指向一个具体的对象

  • 如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变。
  • 如果对象不可变,简单的赋值只能改变其中一个变量的值,其余变量则不受影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值