• Python函数参数传递方式(call by object reference)以及一致性


    Python函数参数传递方式以及一致性

    我们首先来看两个示例:
    示例1:
    >>> a = 1
    >>> def func(b):
        b = 2
    >>> a
    1

    示例2:
    >>> a = [1]
    >>> def func(b):
        b.append(2)
    >>> func(a)
    >>> a
    [1, 2]

    我们发现在示例1中a所指向对象的值未被修改。而示例2中,a所指向对象的值却已经被修改了。我们进一步跟踪将发现,
    示例1中在“b = 2”语句执行后,a和b所指向的对象是不同的(id(a) != id(b));而在示例2中,a和b所指向的对象是同一个。
    有一种解释大概是——示例1中a所指向的对象为不可变对象,所以“b = 2”表达式将使得b指向另一个对象,也就是2,所以a指向
    的对象值并没有被修改,因为它无法修改;示例2中,a为可变对象,所以b的修改将导致a所指向的对象同时被修改,因为它可以
    修改。这个解释勉强能解释的通,但是,是错的。我们来看另一个例子:
    示例3:
    >>> a = [1]
    >>> def func(b):
        b = [2]
    >>> a
    [1]

    示例3中a为可变对象,但是a所指向的对象值依然没有改变,进一步跟踪会发现在“b = [2]”表达式后,a和b指向的对象是不同的。
    我想我们现在应该发现问题所在了。问题就在“=”操作符(“b = 2”、“b = [2]”)。

    Python的“=”操作符的作用就是将name和object关联起来,并将(name, object reference)值对加入当前命名空间。也就是说“b = 2”
    表达式并不是修改b所指向的对象的值,而是将b指向“2”对象。

    综上所述,Python函数参数传递方式是一致的,为call by object reference。

  • 相关阅读:
    Docker 系列(九):docker-compose
    Docker实践:部署Mysql
    Linux 查看端口占用情况
    Docker实践:部署Rabbitmq容器
    VS遇到的一些问题及解决办法(持续更新)
    vue-cli2.0引入nprogress 进度条
    ElmentUI全局禁止点击遮罩层关闭el-dialog弹窗
    mongodb基础教程
    C# Socket网络编程精华篇
    MySQL 日期计算
  • 原文地址:https://www.cnblogs.com/dpsincs/p/3102419.html
Copyright © 2020-2023  润新知