zoukankan      html  css  js  c++  java
  • 【问题记录】python 函数 传入一个对象返回一个对象值得注意

    写了一个函数,这个函数接收一个参数,在函数里面判断这个参数是否为None或者不合法状态,

    如果处于不合法状态,则创建一个对象返回,

    如果合法直接返回

    代码示例如下:

     1 def get_mq_connection(connection=None):
     2     """
     3     @summary 返回 tca 到 smt 的 mq连接:
     4                 如果connection为None或者connection关闭
     5     :param connection:
     6     :return:
     7     """
     8 
     9     if connection is None or connection.is_closed:
    10         credentials = pika.PlainCredentials(config.MQ['user'], config.MQ['password'])
    11         connection = pika.BlockingConnection(
    12             pika.ConnectionParameters(config.MQ['host'], config.MQ['port'],
    13                                       config.MQ['vhost'], credentials))
    14 
    15     return connection

    调用的时候使用如下方式调用:

    utilfunc.get_tca_smt_mq_connection(self._mq_conn)

    本以为这样传入self._mq_conn对象会对象的引用会指向新创建的对象,然后就可以继续使用self._mq_conn,注:因为python传入对象都是引用的形式,所以下意识认为这里没有什么问题,主要是自己没有理解透。

    后来发现这里有问题,测试以下就可以发现,测试代码如下:

        connection = utilfunc.get_mq_connection()
        print id(connection)
        connection.close() # 改变connection为非法状态
    
        utilfunc.get_mq_connection(connection)
        print id(connection)

    输出俩个对象的地址不变:

    69508400

    69508400

    说明了,传入对象的地址是不变的,里面对其进行赋值操作并不会让这个对象指向新对象。需要以如下的方式接收返回对象:

    connection = utilfunc.get_mq_connection(connection)

    原因:

    在python中传入对象引用到函数中,并不像指针那样可以更改指针的指向,传入的对象引用的地址是不变的

    就是说在函数内部新创建一个对象赋值给传入的对象引用这样达不到更改外层调用栈的对象引用参数的指向的目的

    这里应该跟python的实现有关,不深究了

    注:一开始以为是python的赋值符号问题,但仔细一想,好像不对,应该和赋值符号的问题没关系。

    可能因为_mq_conn对象的值传入函数中,在堆栈中临时复制对象引用的值,在函数内部创建的对象赋值给堆栈中的临时变量,

    更改这个值并不会影响_mq_conn的值

  • 相关阅读:
    OpenCV——PS 图层混合算法(一)
    PS 滤镜算法原理——照亮边缘
    PS 色调——老照片效果
    PS 滤镜算法原理——浮雕效果
    PS 滤镜算法原理——碎片效果
    PS 滤镜算法原理——染色玻璃
    PS 滤镜算法原理——高反差保留 (High Pass)
    PS图像特效算法——镜像渐隐
    手把手教你写专利申请书/怎样申请专利
    经常使用的webservice接口
  • 原文地址:https://www.cnblogs.com/pengyusong/p/5776797.html
Copyright © 2011-2022 走看看