书接上文,这篇再记录10条我觉得有用的,虽然没多少人看,但我相信还是会帮助到一部分人的,哪怕是个位数也好,此外,就当作自己的记录吧。没有看过第一篇的朋友点击这里。
1.正确复制一个列表
假设有一个列表a,之后需要复制一份儿这个列表,新列表记作b,假设将b作为b的备份也好,亦或是需要同时维护两个相同内容的列表也罢。那是直接b=a吗?让我们试一逝:
a = [x for x in range(5)]
print('a: ', a)
b = a
a[0] += a[4]
print('b: ', b)
运行上面这一小段代码,可以得到输出:
a: [0,1,2,3,4]
b: [4,1,2,3,4]
用b=a把a赋值给b,根据上一篇里说到的,a和b都是对这个列表的引用,对a进行修改,效果也会在b表现出来,让我们再看看a和b是不是同一个东西:
print(id(a))
print(id(b))
2226674051976
2226674051976
可以看到a和b其实指向的都是同一个东西,在内存里都是同一块地方。正确的复制方法应该是:
b = [x for x in a]
# or
b = [] + a
使用空列表[]+a,python解释器会新建一个新的空列表,再把a的内容放到这个空列表之后,也就实现了列表的复制。
2.熟练使用with
相信一开始对文件操作时大家都肯定会打开文件后忘记关闭,这在学习初期写一些比较短的代码时问题不大,当然如果你能养成open之后记得close的习惯,那就更没有问题了。但还是墙裂推荐养成使用with关键字的习惯,它能帮你关闭你忘记关闭的文件,省时又省力,写出来的代码还好看,再结合上一篇提到的try语法,更能让你无后顾之忧。例如:
try:
with open("something.txt","r") as f:
for each_line in f:
print(each_line)
except OSError as reason:
print("something wrong " + str(reason))
不仅仅是文件,with还能帮助我们管理其他资源,例如需要用python访问数据库时,也可以用with作为资源的管理器,换言之,可迭代的资源(文件,数据库等)都可以用with来进行管理。
3.python的整数和字符
考虑下面几句代码,猜想结果会是什么:
a = 12
b = 12
print(id(a) == id(b))
a = 12345678
b = 12345678
print(id(a) == id(b))
是两个True?可能有了前面的经验,会有人觉得会是两个True,但是其实是True和False,究其原因,python对小整数,有一个整数池,预先对这些小整数分配了空间,当需要用到小整数时,直接返回这些空间的引用就完事儿了,(至于这个小整数范围,我忘了,欸嘿)但对于大整数,会先分配空间,再返回引用给变量,同理,对于常用的单字符如a-z,python的机制也是事先准备了“池”。知道这个可能对写代码没啥实质性的帮助,但多少对python对象的机制有多一点了解。
4.可变对象和不可变对象
考虑一个函数,参数是一个列表和一个元组,在这个函数里对它们进行修改,试问当这个函数返回后,原列表和元组会不会被改变?
def testListTuple(tup :tuple, lis :list):
tup[0] = 2 * tup[0]
lis[0] = 2 * lis[0]
a_tup = tuple((1,2))
b_list = list([1,2])
print(b_list)
testListTuple(a_tup, b_list)
print(b_list)
运行,此代码会报错,因为元组类型是不可更改类型,只能读,不能在函数里写,
TypeError: 'tuple' object does not support item assignment
将第二行修改tup的代码注释掉,运行,可以经过函数后,b_list变量被修改了,这一点可能大多习惯C/C++函数传值类型参数的同学会比较不习惯,还是因为“一切皆为对象的思想”,此处传递给函数的列表仍然是列表的引用,就跟C++的传引用符&一样,是对变量本身直接进行修改的,python的可变对象只有字典(dictionary)和列表(list)类型,其余都是不可变,因此如果需要用一个函数操作一个列表,而不希望对这个列表本身产生影响,就需要手动复制一个列表再传递给那个函数。有时候莫名其妙的bug可能就是由这个引起的。
5.没了,但是!
写到这发现以前做的初学笔记好像就这些了,好像确实有点短,如果再找到另外的笔记,会继续补上。希望对你有用。
不出意外找到另外的笔记的话,三天内更新第三篇,如果对你有帮助的话,记得点个赞哦,您的支持就是对我最大的鼓励。
第三篇加量更新,欢迎各位捧场: