• 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),对变量赋值,仅仅是改变其引用方向;对于可变数据对象,通过变量引用,可分次可以局部改变存储实体中的内容。并且,不可变对象的地址是共享的,即其在内存中唯一存在;而对可变对象,每次创建均会分配新的地址。不可变对象传递时,相当于传递的是值;可变对象传递时,相当于传递的是指针。

  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/HZL2017/p/9332394.html
Copyright © 2020-2023  润新知