python数组引用传递(python的值传递和引用传递区别,哪些类型值传递,哪些是引用传递)

1.python的值传递和引用传递区别,哪些类型值传递,哪些是引用传递

值传递仅仅传递的是值

引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。

用数组来举例就最清楚了,例如我们定义一个数组a[]={1,2};

那么a[0]=1,a[1]=2。

如果我们把数组a里的元素值作为参数传递,实际上只是进行了值传递,对数组本身没有影响

如果我们把 数组a的指针作为参数传递,那么假如处理的函数就可以直接修改数组a里的值。

代码实例:(只是写个大概的逻辑,语法可能有错误)

main()

{

int a[]={1,2};

test(a);

printf(a[0]); //此处打印的值是3, 这就是引用传递。

}

public void test(int b[])

{

b[0]=3;

}

2.python 怎么引用参数传递

如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来…… 《在Matlab中把struct当成Python中的Dictionary使用》《Matlab和Python的几种数据类型的比较》)。

既然提到了MEX,就简单说一下: 一个Matlab可能形如function ret=add3(a,b,c) 如果在C的层面实现这个函数,就会看到另一种景象:void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[]) a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明Matlab函数的参数是传递指针的,而不是值传递。 纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了。

Python是开放源码的,我没有看。所以下面很多东西是猜的。

Python在函数的参数传递时用的什么手法?实验一下(使用ActivePython2.5): 首先介绍一个重要的函数:>>> help(id)Help on built-in function id in module __builtin__:id(。) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.) 看最后括号里那句:Hint:it's the object's address.(它是对象的地址) 有了这个函数,下面的事情就方便多了。

>>> a=0>>> id(a)3630228>>> a=1>>> id(a)3630216 可以看出,给a赋一次值,a的address就改变了。在C的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):void * pa;pa=malloc(sizeof(int));*(int *)pa=0;free(pa);pa=malloc(sizeof(int));*(int *)pa=1; Python中每次赋值会改变变量的address,分配新的内存空间,所以Python中对于类型不像C那样严格要求。

下面看看Python函数参数传递时到底传的什么: 有一个函数:>>> def changeA(a):。 print id(a)。

a=100。 print id(a) 设定一个变量var1:>>> var1=10>>> id(var1)3630108>>> changeA(var1)36301083631012>>> var110 调用函数后,从两次print的结果可以看出,传递确实是地址。

但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用print id(a)得到不同的结果),却没有改变实参的指向。在C的层面看也许类似下面的情节:void changeA(void * pa){ pa=malloc(sizeof(int)); *(int *)pa=100; free(pa);} 精通C的你一眼就看出这个函数永远也改变不了它外面的世界。

也就是说虽然传递的是地址,但像changeA这样的函数改变不了实参的值。 也许会感到困扰?不,我已经在Matlab中习惯了。

一个最典型的例子就是Matlab中删除结构体成员的rmfield函数(参见《Matlab笔记三则》), (Matlab版本7.0.1) 如果想删除结构体patient的name成员,用rmfield(patient, 'name'); 是永远达不到目的的(就像试图用双手抓住自己的领子,把自己提到空中); 迷途知返的做法是:patient = rmfield(patient, 'name');。

3.python 是值传递还是引用传递 知乎

那要看数据类型了,int,float,str这种就是传值,list,dict,类的实例,自定义对象都是穿引用。

下面是示例代码:

def change(int1,float1,str1,dict1,obj1,list1):

int1+=1

float1+=1

str1+='changed'

dict1['none_exist_key']='none_exist_value'

obj1=None

list1.append('change')

class obj:

pass

int1=0

float1=0.0

str1='origin'

dict1={'key':'value'}

obj1=obj()

list1=['only_element']

print(int1)

print(float1)

print(str1)

print(dict1)

print(obj1)

print(list1)

change(int1,float1,str1,dict1,obj1,list1)

print('after change')

print(int1)

print(float1)

print(str1)

print(dict1)

print(obj1)

print(list1)不明白可追问。

4.C++调用时python时,如何传入数组做为参数

题主,你基本操作没什么问题,有几个小地方要修改一下,修改如下:

你的源码:

PyObject* list = PyList_New(3);

for (size_t i = 0; i < 3; i++)

PyList_Append(list, Py_BuildValue("i", i));

PyEval_CallObject(pFunc, list);

--------------------------------------------------------------------------------------

修改后,应该是这样

PyObject* pArgs = NULL;

PyObject* list = PyList_New(0); //3改成0

pArgs = PyTuple_New(1); //定义1个参数

for (size_t i = 0; i < 3; i++)

PyList_Append(list, Py_BuildValue("i", i)); //这样才能用Append,

PyTuple_SetItem(pArgs, 0, list); //将列表赋给参数

PyEval_CallObject(pFunc, list); //传入参数,调用函数

注意事项:PyList_New(0) 初始化0的时候,应该用Append初始化

PyList_New(3) 初始化3个时候,应该用SetItem初始化

如果用Append的话,会出现[NULL, NULL, NULL]的情况我在给一个完整的:

Python :(hello.py)

def TestList(nlist):

print(nlist)

return

一般参数都是已元组形式传入的

Py_Initialize();

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

PyObject* pModule =NULL;

PyObject* pList = NULL;

PyObject* pFunc = NULL;

PyObject* pArgs = NULL;

pModule = PyImport_ImportModule("hello");

pFunc = PyObject_GetAttrString(pModule, "TestList");

pArgs = PyTuple_New(1);

pList = PyList_New(0);

for (int i = 0; i < 3; i++)

{

PyList_Append(pList, Py_BuildValue("i", i));

}

PyTuple_SetItem(pArgs, 0, pList);

pRet = PyEval_CallObject(pFunc, pArgs);

Py_Finalize();最后输出的:[0, 1, 2]

5.python参数传递是值传递还是引用传递

那要看数据类型了,int,float,str这种就是传值,list,dict,类的实例,自定义对象都是穿引用。

下面是示例代码:def change(int1,float1,str1,dict1,obj1,list1): int1+=1 float1+=1 str1+='changed' dict1['none_exist_key']='none_exist_value' obj1=None list1.append('change')class obj: passint1=0float1=0.0str1='origin'dict1={'key':'value'}obj1=obj()list1=['only_element']print(int1)print(float1)print(str1)print(dict1)print(obj1)print(list1)change(int1,float1,str1,dict1,obj1,list1)print('after change')print(int1)print(float1)print(str1)print(dict1)print(obj1)print(list1)。

python数组引用传递

转载请注明出处编程代码网 » python数组引用传递(python的值传递和引用传递区别,哪些类型值传递,哪些是引用传递)

资讯

Python类虚函数(类中snip是什么python)

阅读(50)

本文主要为您介绍Python类虚函数,内容包括python怎样调用基类函数,python中的析构函数多继承时为什么只析构自己,对于父类不会被析构,python类中类方法和类实例有什么区别。snip 的英文原意是削减,剪去的意思。在Python 中,snip 就是代表省略

资讯

python运行指定文件(如何用Python打开指定的某个文件夹)

阅读(50)

本文主要为您介绍python运行指定文件,内容包括如何用Python打开指定的某个文件夹比如我要用Python打开D盘里,python中,如何用指定的程序打开指定的文件,比如在windows下,用,怎么在Python进入指定文件夹。操作系统一般不允许程序直接操作磁

资讯

python处理中文字符串(Python3.5如何对中文字符串进行处理)

阅读(46)

本文主要为您介绍python处理中文字符串,内容包括Python3.5如何对中文字符串进行处理,请问python怎么可以很好的处理中文字符,python处理中文字符串用什么编码方式。在Python的string前面加上r, 是为了告诉编译器这个string是个raw string,不

资讯

python能干什么知乎(java工程师一般用python做什么知乎)

阅读(51)

本文主要为您介绍python能干什么知乎,内容包括python可以做什么知乎,python可以做什么知乎,java工程师一般用python做什么知乎。#做网站后台Python在网站后台这边有大量的成熟的框架,如django,flask,bottle,tornado,我曾经用过flask

资讯

python3md5解密(如何使用Python3的两个库来加解密字符串)

阅读(47)

本文主要为您介绍python3md5解密,内容包括如何使用Python3的两个库来加解密字符串,python,求一个获取文件md5的算法,python,如何对文件内容进行md5处理。哈希如果需要用到安全哈希算法或是消息摘要算法,那么你可以使用标准库中的 hashlib 模

资讯

python一致性hash(一致性hash虚拟节点怎么理解)

阅读(48)

本文主要为您介绍python一致性hash,内容包括一致性hash和hash的区别,一致性hash虚拟节点怎么理解,什么叫memcache一致性hash。一致性哈希基本解决了在P2P环境中最为关键的问题如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量

资讯

python元组排序(Python3,怎么按指定元组顺序将列表排序)

阅读(20)

本文主要为您介绍python元组排序,内容包括Python3,怎么按指定元组顺序将列表排序,python元组中有字典,如何对其进行排序谢谢,如何在python中对tuple排序。在Python中可以使用sorted函数对list进行排序,但是如果排序的对象是一个包含tuple的l

资讯

python构造字典(python字典中如何创建字典)

阅读(22)

本文主要为您介绍python构造字典,内容包括python字典中如何创建字典,Python中的字典是什么,Python中创建字典的几种方法总结。python---创建字典的方式用{}创建字典代码:x = {"a":"1", "b":"2"}print x输出:{a: 1, b:

资讯

macpythonbs4(mac版python怎么安装beautifulsoup)

阅读(22)

本文主要为您介绍macpythonbs4,内容包括在mac上自己安装了python3.4,怎么安装各种库,mac版python怎么安装beautifulsoup,如何在MAC系统下的python中导入第三方库,如lxml和requests搜狗。安装pythonsudo rm -rf /System/Library/Frameworks/

资讯

base64pythonhex(base64.decodestringpython怎么实现)

阅读(20)

本文主要为您介绍base64pythonhex,内容包括Python怎么能简单实现Base64编码和解码,Python怎么能简单实现Base64编码和解码,pythonbase64在哪个模块。Base64编码是一种“防君子不防小人”的编码方式。广泛应用于MIME协议,作为电子邮件的传输

资讯

python布尔取反(将布尔型取反的函数是什么)

阅读(23)

本文主要为您介绍python布尔取反,内容包括将布尔型取反的函数是什么,在python中为什么不能对字符取反,变量show是布尔型的,这里取反怎么错了。如果T为布尔型,则取反的函数是 NOT T。布尔型的值只有两个:false(假)和true(真)。false的序号为0,true

资讯

Python类虚函数(类中snip是什么python)

阅读(50)

本文主要为您介绍Python类虚函数,内容包括python怎样调用基类函数,python中的析构函数多继承时为什么只析构自己,对于父类不会被析构,python类中类方法和类实例有什么区别。snip 的英文原意是削减,剪去的意思。在Python 中,snip 就是代表省略

资讯

python运行指定文件(如何用Python打开指定的某个文件夹)

阅读(50)

本文主要为您介绍python运行指定文件,内容包括如何用Python打开指定的某个文件夹比如我要用Python打开D盘里,python中,如何用指定的程序打开指定的文件,比如在windows下,用,怎么在Python进入指定文件夹。操作系统一般不允许程序直接操作磁

资讯

python处理中文字符串(Python3.5如何对中文字符串进行处理)

阅读(46)

本文主要为您介绍python处理中文字符串,内容包括Python3.5如何对中文字符串进行处理,请问python怎么可以很好的处理中文字符,python处理中文字符串用什么编码方式。在Python的string前面加上r, 是为了告诉编译器这个string是个raw string,不

资讯

python能干什么知乎(java工程师一般用python做什么知乎)

阅读(51)

本文主要为您介绍python能干什么知乎,内容包括python可以做什么知乎,python可以做什么知乎,java工程师一般用python做什么知乎。#做网站后台Python在网站后台这边有大量的成熟的框架,如django,flask,bottle,tornado,我曾经用过flask

资讯

python3md5解密(如何使用Python3的两个库来加解密字符串)

阅读(47)

本文主要为您介绍python3md5解密,内容包括如何使用Python3的两个库来加解密字符串,python,求一个获取文件md5的算法,python,如何对文件内容进行md5处理。哈希如果需要用到安全哈希算法或是消息摘要算法,那么你可以使用标准库中的 hashlib 模

资讯

python一致性hash(一致性hash虚拟节点怎么理解)

阅读(48)

本文主要为您介绍python一致性hash,内容包括一致性hash和hash的区别,一致性hash虚拟节点怎么理解,什么叫memcache一致性hash。一致性哈希基本解决了在P2P环境中最为关键的问题如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量

资讯

python列表元素排序(Python中,如何给列表排序)

阅读(18)

本文主要为您介绍python列表元素排序,内容包括Python怎么对列表中元素排序,python对列表里的元素进行排序,python对列表里的元素进行排序。Python中给列表排序的方式有很多,可以自己实现知,也可以用Python提供的方法使用Python提供的方法:列表