pythonconst传参,python类传参数

本文目录一览:

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]

python中的argparse模块怎么参数传递

argparse是用于脚本带参数使用的,假设你有如下脚本名为prog.py,内容如下:

import argparse

parser = argparse.ArgumentParser(description=’Process some integers.’)

parser.add_argument(‘integers’, metavar=’N’, type=int, nargs=’+’,

                   help=’an integer for the accumulator’)

parser.add_argument(‘–sum’, dest=’accumulate’, action=’store_const’,

                   const=sum, default=max,

                   help=’sum the integers (default: find the max)’)

args = parser.parse_args()

print args.accumulate(args.integers)

你在控制台终端上输入python prog.py -h即可获得帮助说明

$ python prog.py -h

usage: prog.py [-h] [–sum] N [N …]

Process some integers.

positional arguments:

 N           an integer for the accumulator

optional arguments:

 -h, –help  show this help message and exit

 –sum       sum the integers (default: find the max)

在再终端带参数输入命令行中,即可求得值

$ python prog.py 1 2 3 4

4

$ python prog.py 1 2 3 4 –sum

10

Python 的函数是怎么传递参数的

Python 的函数传递参数:

Python 传参数可以理解为 C 的 const 指针(your_type* const your_variable),它所指向的对象可以被修改产生副作用,但变量本身不能修改指向其他对象。这个和 C++ 的 reference 差不多。

所以如果一定要产生 C 的修改指针指向其他对象的效果,用 list、dict 或其他自定义的 mutable 对象包装是一个办法,但我认为这样是一种不良实践。在 C 语言中用参数输出结果有非常多的理由:

C 语言没有 tuple,不能返回多值,除非声明一个 struct 类型。这种情况下划分 in 参数和 out 参数成为一种惯例

C 语言没有异常机制,返回值一般要保留给 errno

但这些情况在 Python 中都是不存在的

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)

3630108

3631012

var1

10

调用函数后,从两次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’);

原创文章,作者:GNGYG,如若转载,请注明出处:https://www.506064.com/n/316336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
GNGYGGNGYG
上一篇 2025-01-09 12:14
下一篇 2025-01-09 12:14

相关推荐

  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29

发表回复

登录后才能评论