is 这个操作符。它和 == 的区别在于:== 只判断“值”是不是相等,而 is 则判断是否为同一个对象,也就是地址一致。
可变对象 包括 list、dict、set、自定义类型 等;
不可变对象 包括 int、float、bool、str、tuple 等。
不可变对象可以作为字典 dict 的键 key ,而可变对象不行。比如 list 不能作为字典的键,但 tuple 可以。
Python 中的变量不是装有对象的“ 容器 ”,而是贴在对象上的“ 标签 ”。
m = m + 和 m += 虽然是一样的结果,但 m 指向的对象却发生了变化。原因在于,前者是做了赋值操作,而后者其实是调用的 __iadd__ 方法。
在 python 中赋值语句总是建立对象的引用值,而不是复制对象。
在函数内部对参数的修改是否会影响到外部变量的值,取决于你怎样修改:如果是重新赋值就不会,如果是修改对象自身内容则会。
如果你想要通过一个函数来修改外部变量的值,有几种方法:
通过返回值赋值
使用全局变量
修改 list 或 dict 对象的内部元素
修改类的成员变量
如果我们就是需要产生一个 list 对象的副本,可以通过 [:]
values[:] #生成对象的拷贝或者是复制序列,不再是引用和共享变量,但此法只能顶层复制
values[:] 复制操作是所谓的「浅复制」(shallow copy)
正确的复制嵌套元素的方法是进行「深复制」(deep copy)
b = copy.deepcopy(a)
例:
执行 values[1] = values 的时候,Python 做的事情则是把 values 这个标签所引用的列表对象的第二个元素指向 values 所引用的列表对象本身。执行完毕后,values 标签还是指向原来那个对象,只不过那个对象的结构发生了变化,从之前的列表 [0, 1, 2] 变成了 [0, ?, 2],而这个 ? 则是指向那个对象本身的一个引用
引用 VS 拷贝:
没有限制条件的分片表达式(L[:])能够复制序列,但此法只能浅层复制。
字典 copy 方法,D.copy() 能够复制字典,但此法只能浅层复制