a = 'hello world' b = 'hello world' c = a[:] print(id(a), id(b), id(c)) # 都指向同一个对象 ,1706679966576 1706679966576 1706679966576 print(a==b, a is b, a is c) # 都为True, True True True
1 2 3 4 5 6
>>> a = 'hello world' >>> b = 'hello world' >>> print(a==b) True >>> print(a is b) False
2. 深拷贝和浅拷贝
深拷贝指的是复制内容,单独开辟一个内存,浅拷贝指的是两个变量同时指向一个内存ID。
1 2 3 4 5 6 7 8 9 10
import copy a = [1,2,3,4,5] b = a #浅拷贝,a,b同时指向一个id,当其中一个修改时,另外一个也会被修改。 c = copy.deepcopy(a) #深拷贝,c单独开辟一个id,用来存储和a一样的内容。 d =a[:] #这样也是深拷贝。 e = copy.copy(a) # 当拷贝内容是可变类型时,那么就会进行深拷贝,如果是不可变类型时,那么就会进行浅拷贝 f = (1,3) g = copy.copy(f) print(id(a),id(b),id(c),id(d),id(e),id(f),id(g)) # 1706683021760 1706683021760 1706683112832 1706683111872 1706683034368 1706679894144 1706679894144
if you need to wrap the accesses inside methods, for whatever reason, use @property, which preserves the access semantics. That is, foo.x = 0 now invokes foo.set_x(0).
```py range(1,100,5) #第一个参数表示开始位,第二个参数表示结束位(不含),第三个参数表示步长,就是每5个数返回一次。 a = [i for i inrange(1,10)] #列表生成式表示返回i的值,并且返回9次,每次返回的是i的值。 a = [2for i inrange(1,10)] #这里表示返回2,并且返回9次,但是每次的值都是2。 a = [i for i in range10 if i%2==0] #表示在生成式内部加入if判断,当i除以2的余数等于0的时候将数值返回。 a = [(i,j) for i inrange(5) for j inrange(5)] #表示将i和j的值以元组为元素的形式返回,当i循环一次的时候j循环5次,以此类推。
1 2 3 4 5 6 7 8 9 10 11
a = (i for i inrange(1,10)) #将列表生成试外部的中括号改为小括号,就能将生成式转化为生成器。 print(next(a),a.__next__()) #生成器的取值方式只能使用next的方法。 defnum(): a,b = 0,1 for i inrange(10): yield b #生成关键字yield,有yield的关键字的代码块就是yield的生成器。当运行到yield时代码就会停止,并返回运行结果,当在次运行时依旧是到yield停止,并返回结果。 切记:生成器只能使用next方法。 a,b = b,a+b temp = yield b #这里并不是变量的定义,当运行到yield时就会停止,所以当运行到等号右边的时候就会停止运行,当在次使用next的时候,将会把一个None赋值给temp,因为b的值已经在上轮循环中输出。这里可以使用num().send()方法将一个新的值赋值给temp。 a = num() #将生成器赋值给变量a。 for n in a: #生成器可以使用for循环使用,并且不会出错。 print(n)
5. 迭代器
生成器是可迭代对象,迭代器不一定是生成器。并且迭代器无法回取,只能向前取值。
一个对象具有 iter 方法的才能称为可迭代对象,使用yield生成的迭代器函数,也有iter方法。凡是没有iter方法的对象不是可迭代对象,凡是没有__next__()方法的不是是生成器。(这里的方法都是魔法方法,是内置方法,可以使用dir()查看)
1 2 3 4 5 6 7 8 9 10
for i in'a',[1,2],(3),{4}: pass #可以for循环的对象是可迭代对象。 a = (i for i inrange(100)) #列表生成式,把中括号改为小括号就可以变为一个列表生成器,是可迭代对象。 from collections.abc import Iterable #如果想验证是否是可迭代对象,可以使用isinstance()判断是否是可迭代对象。 print(isinstance('abc',Iterable)) #判断语法