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/zh-hant/n/316336.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GNGYG的頭像GNGYG
上一篇 2025-01-09 12:14
下一篇 2025-01-09 12:14

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python for循環求1到100的積

    Python中的for循環可以方便地遍歷列表、元組、字典等數據類型。本文將以Python for循環求1到100的積為中心,從多個方面進行詳細闡述。 一、for循環語法 Pytho…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python編程二級證書考試相關現已可以上網購買

    計算機二級Python考試是一項重要的國家級認證考試,也是Python編程的入門考試。與其他考試一樣,Python編程二級證書的考生需要進入正式考試,而為了備考,這篇文章將詳細介紹…

    編程 2025-04-29

發表回復

登錄後才能評論