【Python基础】Python中参数传递,实际上是对象的引用传递

在 Python 中,万物皆对象。

因此,和其他语言不同的是,Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者叫对象的引用传递

需要注意的是,这里的赋值传递或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象,只是让新变量与原变量指向相同的对象而已。也就是说,Python 里的对象可以被多个变量所指向或引用。

  • 对于可变对象(列表,字典,集合等等),当其改变时,所有指向这个对象的变量都会改变。
  • 对于不可变对象(字符串、整型、元组等等),简单的赋值只能改变其中一个变量的值,其余变量则不受影响。

关于可变对象与不可变对象,具体可以参考这篇文章。简单来说:

  1. 可变对象:当有需要改变对象内部的值的时候,这个对象的id不发生变化。
  2. 不可变对象:当有需要改变对象内部的值的时候,这个对象的id会发生变化。

注意点 1

在 Python 中,变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。

指向同一个对象,也并不意味着两个变量就被绑定到了一起。如果你给其中一个变量重新赋值,并不会影响其他变量的值。

l1 = [1, 2, 3]
l2 = l1

l1.append(4) # list是可变对象,append操作只是在原列表的末尾插入元素4
l1
[1, 2, 3, 4]
l2
[1, 2, 3, 4]
======================================
l1 = [1, 2, 3]
l2 = l1

l1 = l1 + [4] # 表示创建了一个“末尾加入元素 4”的新列表,并让 l1指向这个新的对象 [1,2,3,4]。但 l2指向的还是原来的列表对象 [1,2,3]
l1
[1, 2, 3, 4]
l2
[1, 2, 3]
======================================
l1 = [1, 2, 3]
l2 = l1

l1 += [4] # 表示在原列表后面添加了元素4,与extend()效果一致
l1
[1, 2, 3, 4]
l2
[1, 2, 34]

:append() 方法用于在列表末尾添加新的对象,它添加的对象可以是列表,也可以是元素,但是与extend不同的是,当添加的对象是列表时,append()会把列表作为一个整体追加到原列表后,而extend会将添加的列表与原列表合并,只是取出其中的值追加到原列表末尾。具体参考这篇文章

对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。

例如,a = 1; a = a + 1,并不是让 a 的值增加 1,而是表示重新创建了一个新的值为 2 的对象,并让 a 指向它。

注意点 2

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

l = [1, 2, 3]
del l

del l 删除了 l 这个变量,从此以后你无法访问 l,但是对象 [1, 2, 3] 仍然存在。Python 程序运行时,其自带的垃圾回收系统会跟踪每个对象的引用。如果对象 [1, 2, 3] 除了 l 外,还在其他地方被引用,那就不会被回收,反之则会被回收。

注意点 3

如果你想通过一个函数来改变某个变量的值,通常有两种方法。

一种是直接将可变数据类型(比如列表,字典,集合)当作参数传入,直接在其上修改;

def my_func(l2):
  l2.append(4)

l1 = [1, 2, 3]
my_func(l1)
l1
[1, 2, 3, 4]

第二种则是创建一个新变量,来保存修改后的值,然后将其返回给原变量。

def my_func(l2):
  l2 = l2 + [4]
  return l2

l1 = [1, 2, 3]
l1 = my_func(l1)
l1
[1, 2, 3, 4]

在实际工作中,我们更倾向于使用后者,因为其表达清晰明了,不易出错。

参考

《Python核心技术与实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值