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

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

如果合法直接返回

代码示例如下:

 def get_mq_connection(connection=None):
"""
@summary 返回 tca 到 smt 的 mq连接:
如果connection为None或者connection关闭
:param connection:
:return:
""" if connection is None or connection.is_closed:
credentials = pika.PlainCredentials(config.MQ['user'], config.MQ['password'])
connection = pika.BlockingConnection(
pika.ConnectionParameters(config.MQ['host'], config.MQ['port'],
config.MQ['vhost'], credentials)) 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的值

【问题记录】python 函数 传入一个对象返回一个对象值得注意的更多相关文章

  1. python函数2(返回值、传递列表...)

    python函数2(返回值.传递列表...) 1.返回值 1.1.返回简单的值 #返回简单值 def get_formatted_name(first_name,last_name): "& ...

  2. 9 - Python函数定义-位置参数-返回值

    目录 1 函数介绍 1.1 为什么要使用函数 1.2 Python中的函数 2 函数的基本使用 3 函数的参数 3.1 参数的默认值 3.2 可变参数 3.2.1 可变位置传参 3.2.2 可变关键字 ...

  3. python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 # 可以减少代码冗余,增加代码复用性 # 使代 ...

  4. Python函数变量和返回值

    Python函数的全局变量和局部变量 1.不同的编程语言,程序可以分为函数和过程两大类,函数具有具体返回值,而过程则不具有具体的返回值,python只具有函数,因为对于它的一般函数,其返回值为所具体返 ...

  5. python函数1_参数,返回值和嵌套

    函数 将重复的代码,封装到函数,只要使用直接找函数 函数可以增强代码的模块化和提高代码的重复利用率 函数的定义和调用 格式 def 函数名([参数,参数...]): 函数体 定义函数 import r ...

  6. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  7. Python函数(一)-return返回值

    定义一个函数可以在最后加上return返回值,方便查看函数是否运行完成和返回函数的值 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR&qu ...

  8. python函数,定义,参数,返回值

    python中可以将某些具备一定功能的代码写成一个函数,通过函数可以在一定程度上减少代码的冗余,节约书写代码的时间.因为有一些代码实现的功能我们可能会在很多地方用到. 1.函数的声明与定义 通过def ...

  9. python学习【第四篇】python函数 (一)

    一.函数的介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以 ...

随机推荐

  1. ASPxPopupControl出现前一次弹框页面解决方法

    设置关闭事件 <ClientSideEvents  CloseUp="CloseUp" /> function CloseUp(s, e) {    s.SetCont ...

  2. [C语言] 数据结构-预备知识跨函数使用内存

    跨函数使用内存 一个函数运行结束,使用malloc函数分配的内存,如果不调用free,就不会释放 在另一个函数中还可以继续使用 #include <stdio.h> #include &l ...

  3. [HTML5] Canvas绘制简单图片

    获取Image对象,new出来 定义Image对象的src属性,参数:图片路径 定义Image对象的onload方法,调用context对象的drawImage()方法,参数:Image对象,x坐标, ...

  4. HashMap概述及其三种遍历方式

    一.HashMap概述: 1.HashMap是一个散列表,它存储的是键值对(key-value)映射: 2.HashMap继承AbstractMap,实现了Map,Cloneable,Serializ ...

  5. JVM原理自总结

    一.成熟的系统调优1.一定要绝对避免循环查数据库和缓存(PS:循环里面就不能有查询缓存,更不能有查询数据库的操作,因为循环的次数没法控制) 2.对于API接口的话,一般都是直接查缓存的,没有查数据库的 ...

  6. Hibernate中查询优化策略

    Hibernate查询优化策略 ² 使用延迟加载等方式避免加载多余数据 ² 通过使用连接查询,配置二级缓存.查询缓存等方式减少select语句数目 ² 结合缓存机制,使用iterate()方法减少查询 ...

  7. python数据类型之字典

    字典定义 字典是一种 key-value 的数据类型,这点很重要,是区别使用列表和字典的依据. 语法格式: info = { 'stu1101': "Aaron", 'stu110 ...

  8. (利用DOM)在新打开的页面点击关闭当前浏览器窗口

    1.在开发过程中我们前端的用户体验中有时候会要求点击一个按钮,关闭当前浏览器窗口.用html DOM就可做到. 2.注意:本次写法要求在新窗口中关闭. target="_blank" ...

  9. Django基础九之中间件

    一 前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上 ...

  10. Linux 加阿里yum源

    阿里 yum 源设置 阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/CentOS系统更换软件安装源 第一步:备份你的原镜像文件,以免出错后可以恢复.mv /etc ...