python函数赋值给对象_【问题记录】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 orconnection.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()printid(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的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值