zoukankan      html  css  js  c++  java
  • Python缺乏调查的陷阱 动态实例属性、引用、逃生

    ——看到哪里。想到哪里,记到哪里

    非常多时候。非常多人学python的时候,会忽略的东西非常多。大多数都盯着能“出货”即可,可是通常在读别人的代码的时候发现,看不懂。。。一方面是自己的代码技巧和经验不足;还有一方面就是自己掌握的东西不全面。而这些往往是基础的东西。还不算高大上的东西。。

    第一:动态实例属性

    Python的类,面向对象的东西和其它语言不太一样。比方实例的属性是能够动态分配的。本来没有的。能够自己加上,就算类中未定义,也能够用,挺方便的。可是建议能一次行定义完整最好,以下举个粒子:

    >>> class Address(object):
    ...         def __init__(self,name,phone):
    ...               self.name = name
    ...               self.phone = phone
    ... 
    >>> jhon = Address('Jhon dov','123456')
    >>> jhon.name
    'Jhon dov'
    >>> jhon.phone
    '123456'
    >>> jhon.wa = 'aaa'
    >>> print jhon.wa
    aaa
    
    jhon.wa这个,就是实例属性的动态分配。原来类中未定义wa属性,可是我们能够通过jhon实例创建一个。

    第二,可变不可变,传引用传值

    究竟传值还是传引用。。

    有时候会乱,那是由于理解不深刻啊。python中还是非常好区分的,举个粒子:

    >>> list1 = [1,'a',['foo','bar'],('cc','opo')]
    >>> list2 = list1
    >>> list2[0]
    1
    >>> list2[2]
    ['foo', 'bar']
    >>> list2[3]
    ('cc', 'opo')
    >>> list2[3][0]
    'cc'
    >>> list2[0] = 2
    >>> list2[2][0] = 'wang'
    >>> list1
    [2, 'a', ['wang', 'bar'], ('cc', 'opo')]
    >>> list2
    [2, 'a', ['wang', 'bar'], ('cc', 'opo')]
    >>> list1[3][0] = 'dd'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    
    能够看出来。直接赋值的这样的传的是引用,就是说list1、list2指向的是内存中同样的地方,就像一个人取了俩名字,这点还是非常好理解的

    再来个栗子:

    >>> alist = list(list1)
    >>> alist
    [2, 'a', ['wang', 'bar'], ('cc', 'opo')]
    >>> list1
    [2, 'a', ['wang', 'bar'], ('cc', 'opo')]
    >>> alist[0] = 3
    >>> alist[1] = 'Z'
    >>> alist[2][1] = "rab"
    >>> alist[3][0] = "111"
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> alist[3] = ['1','2','3']
    >>> alist
    [3, 'Z', ['wang', 'rab'], ['1', '2', '3']]
    >>> list1
    [2, 'a', ['wang', 'rab'], ('cc', 'opo')]
    
    这次不是直接赋值,可是一開始我们比較alist和list1,发现内容一样的。往下看,当对alist中的前两个元素更改的时候,最后与list1不一样了,list1的前两个元素没变。alist变了,这是由于前两个元素,一个是整数一个是字符串,都是不可变的。所以,alist中的前两个元素事实上是list1前两个元素的传值的效果。就是说两者仅仅是值同样,内存中有两份。可是内存中的位置不一样,所以更改alist中的前两个元素时。不影响list1中的;再看list1中的['wang','bar']。这本身就是个列表,我们知道,列表是可变的,所以在python中。这个列表传的是引用。内存中仅仅有一份,所以,改变alist中的这个列表,list1中的也会改变,最后演示了一下。列表中的元组,元组本身不可变,所以更改元组中内容会报错,且传递的是值,可是这个元组作为一个列表中的元素,我们能够总体替换掉。

    可能说的比較乱,自己动手试试就知道了,这就是一个“浅拷贝”和“深拷贝”问题,浅拷贝顾名思义,拷贝的非常浅,能够理解为倒卖指针的家伙,同喝一杯饮料,就是传引用。再详细点的栗子就是,借别人一个东西。无论怎么借,东西就是一个,不会自己添加,假设有人把借的东西用坏了,那就真坏了;深拷贝,传值,每一个人一杯饮料。举个栗子就是,你看见别人一个杯子非常好看,你也想有一个。于是你也买了一个一样的杯子,两个杯子是一样的,可是所属人不一样,假设你不小心把杯子弄啐了,别人的杯子是不可能也跟着坏的。。。

    第三,字符串抑制转义

    新手一開始在读别人代码的时候,特别是读写文件那部分,总会遇到转义的问题,还有不明确转义是什么的也不在少数。照猫画虎的也有。真正理解事实上非常easy就是‘’与其它字符拼在一起的时候。会变成其它的含义,下图给了几个样例

    另一个明显且常见的,file = open('C: ew ext.dat','w'),我们觉得这是打开此文件夹下的dat文件。可是这样不行,由于 是换行符, 是制表符。那怎么解决?

    一个通用的方法就是:字符串抑制转义,使用方法如:

    file = open(r'C:
    ew	ext.dat','w')
    解释:假设r(大写或者小写)出如今字符串的第一个引號的前面,将会自己主动关闭转义机制

    还能够这样解决:

    file = open('C:\new\text.dat','w')
    事实上这两种方式基本一样,如:

    >>> path = r'C:
    ew	ext.dat'
    >>> path
    'C:\new\text.dat'
    >>> print path
    C:
    ew	ext.dat
    >>> 






    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【CF617E】XOR and Favorite Number【莫队】
    【CF617E】XOR and Favorite Number【莫队】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4684428.html
Copyright © 2011-2022 走看看