调用同事函数引发的坑--------python 传值引用和传参引用

调用同事的函数,传入goods_list,获取商品信息,然后将商品信息与goods_list的信息进行匹配,合并。

但是同事返回数据的同时改变了我传入的参数,goods_list。相当于传参引用,也就是在内存中相同的地址进行更改数据,

将我传入的参数goods_list 进行覆盖。导致我的参数不能匹配。

特此记录:

先看一个例子

t_list = [1, 2]
t_dict = {"a":"haha", "b":"hehe"}
t_str = "123"

def test_list(param):
param[0] = 3
return param

def test_dict(param):
param["a"] = "lala"
return param

def test_string(param):
param = "456"
return param

if __name__=="__main__":
print "==test list=%s"%test_list(t_list)
print "==test list=%s"%t_list
print "################################"
print "==test dict=%s"%test_dict(t_dict)
print "==test dict=%s"%t_dict
print "################################"
print "==test str=%s"%test_string(t_str)
print "==test str=%s"%t_str

返回数据如下

返回值==test list=[3, 2]
原值==test list=[3, 2]
################################
返回值==test dict={‘a‘: ‘lala‘, ‘b‘: ‘hehe‘}
原值==test dict={‘a‘: ‘lala‘, ‘b‘: ‘hehe‘}
################################
返回值==test str=456
原值==test str=123

和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值‘来传递对象。

时间: 2024-11-06 13:50:03

调用同事函数引发的坑--------python 传值引用和传参引用的相关文章

php调用java写的WebService不能传参问题解决

前言:  刚刚做了一个事,php调java的soap接口,但是并没有什么文档,只有看以前写的java调用用来写.所以java是可以正常调用的,出现的问题是php能调到接口,但是接收不了参数. 开始没看懂那个java调用,设置targetNamespace是什么鬼,翻遍了php手册,吧英文翻译过来看了才知道,SoapVar对应了soap数据的封装. 网上收了,发现他们都在乱答.浪费我时间,还不如自己看手册. 问题出在:命名空间 java soapClient:  /**  * saleOrderI

python函数传参是传值还是传引用?

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

记一次python的print函数引发的血案

我最近项目是基于自研的webserver框架实现的,支持C++.Java.Python等语言混合开发,上线一年多都没有发现重大问题.但就在昨天快下班时,运营同事突然打电话说生产环境无法导入报表,于是我登录生产环境,看了一下日志,发现报表文件已经正常上到服务器,但在解析时无法正常打开. 我们的报表都是xls格式,导入功能是Python开发的,我们选择xlrd库来解析xls文件.查看日志发现xlrd在打开文件时报“输入/输出错误”,具体日志如下: [20190614 17:28:48|ERR] sy

python中给函数传参是传值还是传引用

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

#python#子类调用父类函数的方法

Python中的子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数. 如下例程里,???处是需要调用父类函数的地方,接下来结合例程具体介绍. 1 1 # -*- coding:utf-8 -*- 2 2 class Student: 3 3 def __init__(self,name): 4 4 self.name=name 5 5 def ps(self): 6 6 print('I am %s'%self.name) 7 7 8 8 class Scor

项目记录 -- python调用回调函数

C源文件: 1 static int 2 get_callback(zpool_handle_t *zhp, void *data) 3 { 4 zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data; 5 char value[MAXNAMELEN]; 6 zprop_source_t srctype; 7 zprop_list_t *pl; 8 9 for (pl = cbp->cb_proplist; pl != NULL; pl = pl

python 调用c函数

Python调用c 一个典型的Python扩展模块至少应该包含三个部分:导出函数.方法列表和初始化函数. 例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 example.c int fact(int n) {         if (n <= 1)         return 1;         else         return n * fact(n - 1); }

实习小记-python 内置函数__eq__函数引发的探索

乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, other): # 不论发生什么,只要有==做比较,就返回True ... return True ... >>> a = A() >>> b = A() >>> a == b True >>> a != b # 这个地方为什么会返回False? False >>> a > b Trac

【转】Python调用C函数

原文链接: Python调用C函数 – 快课网http://www.cricode.com/359.html 关键字:Python ctypes,Python调用dll,Python调用C函数为了节省软件开发成本,软件开发人员希望能够缩短的软件的开 发时间,希望能够在短时间内开发出稳定的产品.Python 功能强大,简单易用,能够快速开发应用软件.但是由于 Python 自身执行速度的局限性,对性能要求比较高的模块需要使用效率更高的程序语言进行开发,例如 C 语言,系统的其他模块运用 Pytho