美文网首页
python深层机理

python深层机理

作者: 大空想家_ | 来源:发表于2020-02-03 10:58 被阅读0次
    ###一.变量
    1.
    可变对象和不可变对象:
    不可变对象包括int,float,string,tuple等。
    可变对象包括list,dict,自定义类的实例等。
    2.
    变量在内存中新建时,系统都会给他分配一个地址,然后通过地址去查找或引用他的值。 
    Python的所有变量其实都是指向内存中的对象的一个指针,都是值的引用
    3.
    在python中通过= 复制的变量,都是同时把变量的值,也把变量在内存中的地址复制也过去了。
    即=复制过的变量不仅内存地址一样,变量的值也一样。
    但是需要注意的是:对于不可变类型(如int)的变量,如果要更改变量的值,
    则会创建一个新值,并且给这个新值分配一个新的内存地址,
    然后把变量指向这个新值的内存地址上,而旧值如果没有被引用就等待垃圾回收。
    如果是可变类型变量。如果修改变量的值,则可以直接修改变量的值,变量的引用地址不会变。
    4.
    python中变量要先赋值才能使用,实际上是可以看做指针
    变量相当于是值的标签,也可以视为变量指向这个值,对于a=4凡是有等号只是赋值不是赋的关系
    a=[1,2,3]
    b=a
    a.append(4)
    print(b)#b=[1,2,3,4]
    #在python中对于list是浅拷贝,只拷贝首地址,而其他元素通过偏移量来找到
    #而对于a.apeend(4)这个没有等号就没有地址的改变,而是通过偏移量找到最后的位置添加4
    #而对于b也同时指向了这个列表,所以b也改变了
    5.
    同一个代码块中或者一个py文件的不可变对象,
    只要值是相等的就不会重复创建新的对象,而是直接引用已经存在的对象
    6.闭包
    函数外的变量无法在函数内被修改,
    一旦被赋值该变量即为本地变量,而且本地变量必须先赋值才能使用
    python运行前会先查看全部代码,确定本地变量,之后函数内的本地变量执行的时候都必须满足先赋值后使用
    1.
    a=1
    def fun():
           y=a+1
           a=2
           print(y)
           print(a)
    fun()
    print(a)
    如上代码,运行是错误的,因为pytho运行前会先看下代码确定本地变量,在a=2语句时a是本地变量,
    那么y=a+1语句调用了a这个本地变量,该语句在之前a没有被赋值,所以是运行错误
    2.
    a=1
    def fun():
        a=a+1
    如上代码a已经被确定是本地变量,a+1的a是还没有值的所以错误
    3.
    a=1
    def fun(a):
        a=a+1
        print(a)
    fun(a)#2
    print(a)#1
    如上代码a被赋值a成为本地变量,a=a+1时此时的a是有值的,传参传进来的,
    但函数内的本地变量与函数外的变量是无关的
    4.对于类来说改变类的属性的值,这个类是没有被改变的,属性会被改
    class A():
           def __init__(self):
                  self.s=1
    a=A()
    def fun():
         a.s=2
         print(a.s)
    fun()#2
    print(a.s)#2
    
    
    ###二.函数参数类型
    1.
    位置参数,默认参数,可变参数,命名关键字参数,关键字参数
    def fun4(a,b=0,*c,d,**e):
           print(a)#1 #
           print(b)#2 #默认参数如果没给值就会赋默认值
           print(c)#(3,4) #可变参数,参数个数可变,这些可变参数在函数调用时自动组装为一个tuple
           print(d)#5 #命名关键字参数,必须传入参数名
           print(e)#{'g':6,'h':8}#可以传入任意个关键字参数,并在调用的时候组装为一个dict
    fun4(1,2,3,4,d=5,g=6,h=8)
    2.
    #Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去
    def fun5(a,b,c):
    fun5(*[1,2,3])#这样传入的参数就会变成解包成三个参数传进去
    3.
    def a(x=[1]):
           x.append(2)
           print(x)
    def fun6():
           a()#[1,2]
           a([2])#[2,2]
           a()#[1,2,2]
    fun6()
    #默认参数只会执行一次,python在编译的时候已经确定好了每个变量的地址,
    #之后不传参数的都继续在该地址上进行操作
    #第一次执行时往x添加2此时的默认参数x的地址未变,第二次无参调用时在固定的x地址又加了2
    4.
    def fun():
        list1=[[]]
        list2=list1*2
        list2[0].append(1)
        print(list2)#[[1],[1]]
    #python的乘法运算就是把里面的值复制几份,他们指向的是同一个内存地址
    
    ###三.list
    1.append
    对于append会直接将整体元素添加到列表的末尾
    
    2.extend
    参数应该是可迭代的对象,extend函数会将参数解包再加入列表中
    a=[2]
    a.extend([1,[2,3]])
    #对于该extend会对该列表进行一次解包,1,[2,3]加入到a中,所以结果为[2, 1, [2, 3]]
    
    3.insert
    a.insert(0,1)#在0的位置插入字符1,后面的元素后移
    
    4.切片
    a[0:0]=[1,2,7]#在0的位置把1,2,7依次加进列表中
    #如果a[0:0]=[[1,2,7]]则是在0的位置加进[1,2,7]
    a[len(a):]#在末尾加
    
    5.查找字符
    a.find("1")#找到就返回位置,找不到返回-1
    a.index("1")#找到返回位置,找不到就出错
    
    
    ###四.字典
    1.查找字典的键存不存在
    setdefault(key,value)#如果存在返回1,如果不存在返回value的值,所以value不要指定1
    2.get() 函数返回指定键的值,如果值不在字典中返回默认值None
    
    ###五.集合
    s1|s2两个集合的合集
    
    s1 - s2 s1中去除掉s2中有的元素  {2, 3}
    
    s1 & s2 两者的交集{1,4}
    
    s1 ^ s2元素只出现在一个集合中{2,3,5,13}
    
    ###六.
    1.join函数会在字符之间加入头和尾不加
    "&".join("adf")#->a&d&f
    
    2.三元表达式
    a=10 if a==1 else 11
    

    相关文章

      网友评论

          本文标题:python深层机理

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