对python变量和对象引用的探讨

本鸟也是刚刚学习python,对python的变量和内存对象的引用之前有些困惑,经过思考和编码检测后,整理出自己的思考结果。
        首先看看常见情况:
        x=1 #1的引用计数为1
        y=x  #1的引用计数为2
        这两行代码大家肯定知道x指向对象1,y也指向对象1,因此1的引用计数为2。
        那么接下来,继续执行y=2,会怎么样呢?此时一个新的对象2和y联系在一起了,因此y原来对对象1的引用解除,开始指向2。
 可见,一个变量同时仅能引用一个对象,而一个对象可以同时被多个变量引用(或者叫指向)。    
         继续探讨:
        x=1# x指向对象1
        x+=1 #x指向新的对象2
        执行完这两行代码后,x的值是多少呢?是2,为什么是2呢?分析下过程,首先x指向1,然后执行x+1(系统会读出x指向的内存对象1,然后参与
        加1运算从而产生一个新的对象2,然后执行x=2,可见x指向了新的对象2)。下面是我的验证代码

        #!/usr/bin/python

        91pron free videos

         x=1
         print x,id(x)
         x+=1
         print x,id(x)
        运行结果:
        1 10216248
         2 10216224
        通过对比id号可知x已经指向不同的内存对象了。
        同时可以看出:赋值=号的右边如果仅是变量名,则不会产生新的对象,如果右边是变量名参与运算了就会产生新的对象。
        再探讨:
         def  fun(x)
               x=1
          i=2
          fun(i)
          调用函数fun会发生什么呢?首先是形参=实参(即x=i),因此形参x与i指向同一个对象2,然后执行函数fun内部的代码x=1
    这时就与上面的情形一样了,x原来指向对象2.现在指向新的对象1了,因此该函数执行完后,变量i仍然是1,不会是2.也就是说
   调用函数fun并没有修改变量i指向的对象内容,也就是说没有在函数内部实现修改外部变量的值,那么可以在函数内部实现修改函
   数外部变量的值吗?答案是肯定的,不过我们先看下面这段代码。
          list=['1','2','3','4']
           mylist=list   #此时mylist也指向对象['1','2','3','4']
          list[0]='a'
          那么mylist[0]会是什么呢?是a,也就是说mylist指向的内容发生改变了,对比之前的代码:
          x=1
          y=x
          y=2  # x还是1内容没有改变,y是2
          这两段代码有相同点也有不同点。分析一下第一段代码的执行过程:
          首先mylist与list已经指向同一个内存对象了,而接下来操作的是list[0]而不是list,list[0]原来指向对象1,执行完list[0]='a'就改
  为指向对象a了,对象1已经被回收了,因此mylist的值也跟着改变了。
           这样就可以根据上述代码,可以给函数的参数传递列表,在函数内部修改列表的某个子对象,这样就可以修改函数外部的变量值了。
   当然,使用全局变量也是可以实现在函数里面修该函数外部的变量值的,这是不同的技术。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值