a = [1,2,3,4] b = a
每一个变量都有标识,类型和值.对象一旦建立,它的标识毫不会变;标识能够简单的理解为对象在内存中的地址.python
a
跟 b
是别名指向 [1,2,3,4]
,若是a增长新的内容,b也会增长. b == a
为 true
.==
运算符比较连个对象的值(对象中保存的数据)b is a
为true
,由于他们都指向 [1,2,3,4]
这个列表,is
比较对象的标识元组相对不可变性数据结构
python
的集合set
同样,若是引用的元素是可变的,即使元组自己不可变,元素依然可变.即:元组的不可变形其实指tuple
数据结构的物理内容(即保存的引用)不可变,与引用对象无关 默认作浅层复制app
浅层复制
: 1.复制了最外层容器,副本中的元素是源容器中元素的引用 2.他们的值相等,单二者指向不一样的对象. 3.副本共享内部对象的引用 浅层复制
函数
list
会致使意想不到的问题.l1 = [3,[66,55,44],(7,8,9)] l2 = list(l1) l1.append(100) # 因为只复制了外层容器,这里仅有l1内容发生变化 l1[1].remove(55) # l1[1] 是一个list可变的元素,全部以l2[1]的元素也发生变化 l2[1] +=[33,22] l2[2] += (10,11) # l2[2]是tuple,不可变的元素全部只有l2[2]发生变化.
深层复制,副本不共享内部对象的引用code
函数的参数做为引用时对象
python
中惟一支持的参数传递模式是共享传参 call by sharing
共享传参:
函数的各个形式参数得到实参中各个运用的副本,便是函数内部的形参是实参的别名 影响:
函数可能会修改做为参数传入的可变对象,但没法修改那些对象的标识 不要使用可变类型做为参数的默认值可变参数
做为默认值会致使:若是么有指定内容,会共用一个对象
.因此一般使用Nono
做为接收可变值得参数的默认值
.内存
防护可变参数rem
del
和垃圾回收容器
一个对象的引用数量为0的话会被销毁