Python创建对象与赋值

来源:互联网 发布:网络优化工程师前景 编辑:程序博客网 时间:2024/06/02 18:18

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初学者


原创粉丝点击