zoukankan      html  css  js  c++  java
  • Python中变量的本质探索

    Python中变量的本质探索

    参考:Vamei博客Python进阶09 动态类型

    '''
    a = [1,2,3]
    '''
    (1)这条“赋值语句”实际上是将a指向对象“[1,2,3]”,对象“[1,2,3]”是存储在内存中的实体,而a仅仅是指向这一对象的引用(reference)。a相当于一个对象地址存储器,即C语言中的指针,指向不同的对象,指针指向变化时,原对象不发生变化。引用和对象分离,是动态类型的核心。

    (2)同样,给引用赋不同的值,仅仅是将其调整不同的指向,并不改变原对象的内容。 而,变量之间的值交换,也只是将被赋值的变量的指向更改。

    (3)可变数据对象(mutable bject)和不可变数据对象(immutable object)
    是否可以通过引用改变对象本身。
    如,对于列表和词典,可以通过引用修改存储实体,称为可变数据对象。而,数字、字符串元组仅能调用对象,不能修改,称为不可改变数据对象。

    对于(2)中提到的,仅适用与不可改变对象;对于可变数据对象,因为直接修改的是存储实体,所以所有指向该实体的引用的内容都会发生变化。

    以上问题,还涉及到函数的参数传递问题:如果传递的是可变数据对象,那么函数体内可以修改存储实体,对等于C语言中的地址传递;如果传递的是不可变数据对象,那么传递的是引用,函数体内不能修改实体。编程时,切切注意,如直接传递列表,可能会导致列表内容发生改变,如果要保证其不发生变化,可以考虑用元组做传递参数。

    (4)总结:python中的变量实质上是指向存储实体的指针(引用reference),对变量赋值,仅仅是改变其引用方向;对于可变数据对象,通过变量引用,可分次可以局部改变存储实体中的内容。并且,不可变对象的地址是共享的,即其在内存中唯一存在;而对可变对象,每次创建均会分配新的地址。不可变对象传递时,相当于传递的是值;可变对象传递时,相当于传递的是指针。

  • 相关阅读:
    json-lib 中关于null与"null"
    Android SDK及Build版本配置说明
    WebStorm下Webpack的Source map问题
    简述Javascript的原型链
    Hbuilder中添加Babel自动编译
    理解Java的lamda表达式实现
    CountDownLatch多个主线程等待示例
    关于CyclicBarrier的执行顺序
    【转载】让Go2Shell支持ITerm2 和x-term
    【原创】mac下为eclipse安装反编译插件
  • 原文地址:https://www.cnblogs.com/HZL2017/p/9332394.html
Copyright © 2011-2022 走看看