zoukankan      html  css  js  c++  java
  • Python列表_对象和值与别名

    一,对象和值

    案例1,如果我们运行下面这种赋值语句:

    >>> a = 'banana'

    >>> b = 'banana'

    我们知道 a 和 b 定义了一个对象,是字符串;但我们不知道他们到底是不是同一个字符串。这就有可能有两种状态:

    在第一种情况中,a 和 b 指向两个不同的对象,这两个对象有相同的值。在第二个情况下,a 和 b 都指向同一个对象。 

    要检查两个变量是否指向的是同一个对象,可以用 is 运算符。 

    >>> a is b

    True

    案例2,在上面的例子中,Python 只建立了一个字符串对象,然后 a 和 b 都指向它。但当你建立两个列表的时候,你得到的就是两个对象了: 

    >>> a = [1, 2, 3]

    >>> b = [1, 2, 3]

    >>> a is b

    False

    所以这时候的状态图就应该是这个样子了:

    在这个情况下,我们可以说两个列表对象是相等的,因为它们有相同的元素,但它们不是同一个列表,因为他们并不是同一个对象。 

    如果两个对象是同一个对象,那它们必然是相等的(比如案例1),但如果它们相等,却未必是同一个对象(比如案例2)。

    也可以这样做解释:"同一"是相等的充分条件,相等是"同一"的必要条件。

    有时候,我们一直把【对象】和【值】来随意交换使用,但实际上更确切的说法是:"一个对象拥有一个值。"

    如果你计算[1,2,3],你得到一个列表对象,整个列表对象的整个值是一个整数序列;如果另外一个列表有相同的元素,我们称之这些对象含有相同的值,但并不是相同的对象。

    二,别名

    如果 a 是一个对象了,然后你赋值 b=a,那么这两个变量都指向同一个对象:

    >>> a = [1, 2, 3]

    >>> b = a

    >>> b is a

    True

    状态图如下:

    一个变量和一个对象的关系叫做引用。在上面这个例子中,a 和 b 是对同一对象的两个引用;这样一个对象有不止一个引用,就也有了不止一个名字,所以就说这个对象有别名了。 

    如果一个别名对象是可修改的,那么对一个别名做出的修改就会影响到其他引用: 

    >>> b[0] = 40

    >>> a

    [40, 2, 3]

    >>> b[1] = 50

    >>> a

    [40, 50, 3]

    可以看出,修改了变量b索引0和1的值,对应的变量a也被同步更改了。所以,一般处理可变对象的时候,还是尽量避免别名使用,这样更安全些。 

    而对于不可变对象比如字符串来说,别名使用就不是太大问题了 

    a = 'banana'

    b = 'banana'

    a 和 b 是否指向同一个字符就基本无所谓了,几乎不会有任何影响。 

    结束。

  • 相关阅读:
    P2801 教主的魔法 (分块)
    BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
    BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)
    BZOJ_1612_[Usaco2008_Jan]_Cow_Contest_奶牛的比赛_(dfs)
    BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
    BZOJ_1026_[SCOI2009]_windy数_(数位dp)
    BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
    BZOJ_2194_快速傅立叶之二_(FFT+卷积)
    BZOJ_1615_[Usaco2008_Mar]_The Loathesome_Hay Baler_麻烦的干草打包机_(模拟+宽搜/深搜)
    BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13187572.html
Copyright © 2011-2022 走看看