1.变量是便利贴 不是储存变量的盒子
2.检查变量绑定的值是不是None
x is None
3.元组的不可变性就是靠保持元素的标识不变实现的
例如元组中的元素是可变的 修改这个元素会导致和之前的内容不同 但是标识符不会改变
4.复制列表
例 l1 [3, [55, 44], (7, 8, 9)]
l2 list(l1)
或者 l2 [:]
两种方法实现的都是浅复制
复制最外层容器 副本中的元素是引用
例如
l1 [3, [66, 55, 44], (7, 8, 9)]
l2 list(l1)
l1.append(100)
l1.[1].remove(55)#列表的引用不变 所以改变l1会影响l2
此时l1 [3, [66, 44], (7, 8, 9), 100]
l2 [3, [66, 44], (7, 8, 9)]
l1[1] [33, 22]#在原来的基础上加入元素 引用不变
l2[2] (8, 9)#相当于创建了一个新元组 所以不影响l1
此时l1 [3, [66, 44, 33, 22], (7, 8, 9)]
l2 [3, [66, 44, 33, 22], (7, 8, 9, 8, 9)]
5.深复制
deepcopy和copy
copy.deepcopy()即可
6.共享传参
指的是各个形式参数获得实参各个引用的副本 形参是实参的别名 会影响原来的实参
但是之会修改接收到的任何可变对象比如列表
像数字或者元组就不会改变
7.不要使用可变类型作为参数的默认值
例 如果把默认列表作为参数的默认值,绑定的变量是形参的别名 此时用默认值付给形参 形参也是默认列表的别名
绑定的变量变成了默认列表的别名 比如类中 第一个实例使用了默认赋值 做的操作都会影响这个默认列表
后续实例若使用了默认赋值 则使用的列表是已经被修改过的
8.防御可变参数
classs tBus:
def init(self, passengers None):
if passengers is None:#使用这种方式来接受可变对象的默认值
self.passengers []
else:
self.passengers passengers#正确的例子是list(passengers)
def pick(self, name): self.passengers.append(name) def drop(self, name): self.passengers.remove(name)
basketball_team [‘S’, ‘T’, ‘M’, ‘D’, ‘P’]
bus tBus(basketball_team)
bus.drop(‘T’)
bus.drop(‘P’)
此时的busketball_team [‘S’, ‘M’, ‘D’]
9.del 和垃圾回收
del删除名称而不是对象
当检查发现对象没有任何引用时才会被作为垃圾回收
10.弱引用
利用weakref.ref()来获得一个弱引用 可以用于检查对象 但是不会增加引用数 也就是有弱引用但是没有其他引用就会销毁



