本文目錄一覽:
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/zh-hant/n/316336.html