美文网首页
测试Python中变量传递的到底是引用还是值?

测试Python中变量传递的到底是引用还是值?

作者: 时间煮菜 | 来源:发表于2020-08-06 09:48 被阅读0次

先说结论:Python中统一都是引用传递。

理解变量和对象

  • 我们都知道,Python中一切事物皆是对象,变量是对对象在内存中的存储的地址的抽象。所有的变量都可以理解是内存中一个对象的引用。

  • 画图理解如下:

  • 赋值语句“=”是将右侧对象中的内存地址赋给左侧的变量
a = "123"
  • 执行上面这个赋值语句的时候,Python解释器首先在内存中创建一个字符串"123"对象。之后在内存中创建一个名为"a"的变量,将"a"指向"123"(将"123"的地址保存到“a”中)


接下来执行语句

b = a
  • 因为a已经存在,所以不会创建a,会创建变量"b",并将"b"指向"a"指向的字符串"123"

再执行

a = "456"
  • a还是存在的,会创建字符串"456", 然后将"456"的地址赋给"a"


整个过程我们可以通过调用id()方法查看变量所指向对象在内存中的地址。

In [19]: a = "123"

In [20]: id(a)
Out[20]: 2168312990064

In [21]: b = a

In [22]: id(b)
Out[22]: 2168312990064   # 这里a, b的地址相同

In [23]: b
Out[23]: '123'

In [24]: a = "456"

In [25]: a
Out[25]: '456'

In [26]: b
Out[26]: '123'

In [27]: id(a)
Out[27]: 2168313026416  # 这里a的地址指向"456"

Python的引用传递

  • 上面我们理解了变量和对象。Python对象可以分为可变对象(list, dic, set等)和不可变对象(tuple, string, number)两种。
  • 当传递的参数是可变对象的引用时,由于可变对象的值可以修改,因此可以通过修改参数值而修改原对象,这类似于C语言中的引用传递;
  • 当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,但是不可变对象无法修改,所以参数的重新赋值不会影响原对象,这类似于C语言中的值传递。

相关文章

  • 测试Python中变量传递的到底是引用还是值?

    先说结论:Python中统一都是引用传递。 理解变量和对象 我们都知道,Python中一切事物皆是对象,变量是对对...

  • 18-变量

    变量的引用 变量和数据都是保存在内存中的 在python中,函数的参数传递以及返回值都是靠引用传递的 引用的概念在...

  • 027_wz_hm_python变量进阶

    变量的引用 变量和数据都是保存在内存中的,在python中函数的参数传递以及返回值都是靠引用传递的 引用的概念:变...

  • JAVA是按值传递还是按引用传递

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用...

  • python值传递&引用传递

    参考 Python值传递还是引用传递

  • Java Lambda表达式引用局部变量的原理

    规则1 Java中变量分为:基本类型变量和引用类型变量 规则2 Java方法传参只有值传递,没有引用传递,传递的值...

  • 变量理解

    01. 变量的引用 变量 和 数据 都是保存在 内存 中的在 Python 中 函数 的 参数传递 以及 返回值 ...

  • Java值传递和引用传递

    Java中无论基础数据类型还是引用变量,Java参数传递都是值复制的传递过程.对于引用变量,复制指向对象的首地址

  • python-----函数参数相关

    Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而...

  • Java的引用

    参考链接: Java到底是值传递还是引用传递 Java的四种引用方式 Java中的强引用、软引用、弱引用和虚引用 ...

网友评论

      本文标题:测试Python中变量传递的到底是引用还是值?

      本文链接:https://www.haomeiwen.com/subject/ordwrktx.html