zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    二分查找LintcodeNo14
    二次排序LincodeNo.846
    github常用操作
    ubuntu18.04 Testlink安装 配置
    树莓派4B安装ffmpeg
    ubuntu18.04下基于XAMPP的Testlink安装部署
    使用rsync同步服务器和NFS数据
    Pandas Cheat Sheet
    【转】Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)
    gitlab cd ci
  • 原文地址:https://www.cnblogs.com/dpsincs/p/3102419.html
Copyright © 2011-2022 走看看