Python是面向对象的语言,在Python在一切皆为对象。函数、属性都可以作为对象赋值给变量,并且规定参数的传递都是传递对象的引用(传地址)。所以说函数是可以通过赋值给变量的。入python的函数abs
(),通过赋值语句 a=abs;那么下次调用该函数是可以是a(-7)
(一)创建对象
python与C/C++,java等强类型语言不同,在创建对象的时候不需要指定类型。而是通过对象的行为来确定对象的类型,有数字、列表 、元组 、字符串等内置对象
图1
该操作是创建了一个名字叫d的列表
在创建对象的时候是,在内存中创建[1, [1, 2], 3],然后将d指向[1, [1, 2], 3],就是让该对象的地址给d,此时就能通过d访问该对象。
当进行了如下操作
图2
此时d已经不指向[1, [1, 2], 3],那么就不能通过d访问该对象了,假设此时没有任何变量引用该对象。该对象就成为了垃圾对象被Python解释器释放该对象,这种机制就像java的GC(垃圾回收机制)
在上述内置对象中,string字符串是不可变对象,该对象一旦创建就不能改变了跟java里的String类型相似
(二)赋值
Python的赋值和其他的语言赋值是有不同,就如上图1的c=d这条语句,并不是copy d对象然后创建一个新的赋值给c。而是将c指向d指向的对象 既是[1, [1, 2], 3]。如果赋值的时候是创建新的对象给c那么 c和d是两个对象而且是完全没有关系,在c里面加一个数不会影响到d。针对这个问题,我们做一个实验,现在在c里面加一个数看看会怎么样
图3
执行 图3的代码看看结果如何,让我们拭目以待。
图4
结果如图4 c和d的值还是一样说明c在加一个数字4的时候d也跟着加了,说明c和d实际上是引用同一个对象
在测试几次
可以看出切片是将该对象以部分分割给c 让c只指向该对象的一部分
假如我们现在执行如下代码结果会如何?
结果还是会之前一样d会跟着变在后面多一个5吗?
但结果然并卵
在这种情况下c和d最后结果还是分手了(不是指向同一个对象 ps:其实本来就不是c只是引用了对象的部分) 那我们好好探讨为什么这对“恋人”在经历之前那么多磨难这次却分开了,这是为什么呢?
其实这是跟c的改变有关,因为c只是引用了部分的对象当执行c.append(5) 该对象的部分的内部结构就会发生了改变,此时发生改变后,Python就会为c创建新的对象,然后c指向新的对象,此时c和d就没什么关系了。而在第一个例子中的c是应用对象。
总结:
所以我们可以看出c和d指向同一个对象的时候,只要其中一个引用发生了改变那么python就会为该改变创建新的对象。
最后:
第一次写博文流水帐,表达不清望见解,以上的理论也只是我的想法而已,到底实际上是怎么样,我们还要进一步学习 ----python初学者