python深层机理

###一.变量
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深层机理)