python通过变量来引用函数

提问人:库缨时间:2021-08-19 11:56:41

今天遇到个纠结的问题,python通过变量来引用函数?求助

6个回答
梅宛青

{

=null;

(Device.class){

if(display==null||display.)SWT.error(SWT.ERROR_DEVICE_DISPOSED);

if(!display.){

if(runnable==null){

display.wake;

return;

}

禹学成

这不完全是global的问题,运行代码时python会先运行一遍def外的内容

可以说你在点击确定时,python就需要用到img,

有三种解决方法

    是把25行放进def内

    在25行前面定义一个img对象(这种难度较高)

    给25行添加判断if'img'indir:#意思是如果img这个变量存在就调用25行

记得采纳(^_−)☆

公维箭

全局变量不可以作为形参。也就是说他不能被函数引用

可以参考一下这个网站的回答网页链接

冯先硕

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

既然提到了MEX,就简单说一下

一个Matlab可能形如

=add3(a,b,c)

如果在C的层面实现这个函数,就会看到另一种景象

(intnlhs,mxArray*plhs[],intnrhs,*prhs[])

a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明Matlab函数的参数是传递指针的,而不是值传递。

纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了。

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

Python在函数的参数传递时用的什么手法?实验一下(使用.5)

首先介绍一个重要的函数

>>>help(id)

__builtin__:

id(...)

id(object)>integer

.

.(Hint:it''.)

看最后括号里那句Hint:it''saddress.(它是对象的地址)

有了这个函数,下面的事情就方便多了。

>>>a=0

>>>id(a)

228

>>>a=1

>>>id(a)

216

可以看出,给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函数参数传递时到底传的什么

有一个函数

>>>(a):

...printid(a)

...a=100

...printid(a)

设定一个变量var1

>>>var1=10

>>>id(var1)

108

>>>changeA(var1)

108

012

>>>var1

10

调用函数后,从两次print的结果可以看出,传递确实是地址。但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用printid(a)得到不同的结果),却没有改变实参的指向。在C的层面看也许类似下面的情节

(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');

饶枫榆

这个问题的答案无外乎这几种说法:传值,传引用,对于可变对象是传引用,不可变对象是传值。传引用先看下面这个例子:>>>deffoo(n):...printid(n)...n=3...printid(n)>>>n=2>>>id(n)L>>>foo(n)>>>n2>>>id(n)L由foo中两次输出不相等可以看出,传引用说法并不成立。传值来看下面的例子>>>deffoo(n):...printn...n.append(3)...printn>>>n=[1,2,4,8]>>>foo(n)[1,2,4,8][1,2,4,8,3]>>>n[1,2,4,8,3]按传值的说法,一个值传进来,在函数内改动并不会影响变量本身的值,上面例子中n变量本身的值也被改变了,说明传值的说法也不对。3.可变对象传引用,不可变对象传值相比上面两种说法,这种说法似乎更靠谱,传播也更为广泛,那它到底对不对呢?>>>deffoo(n):...printid(n)...n=['1','2','3']...printid(n)...printn>>>n=[1,2,3,4,5,6]>>>id(n)>>>foo(n)['1','2','3']>>>n[1,2,3,4,5,6]按照可变对象传引用的说法,上面list类型是可变对象,应该传引用,这foo方法中两次调用id应该输出一样的值,更改的结果也应该影响到外部变量,但结果显然不是这样的,这说明,这种说法也是不正确的。那么Python传值的方法到底是什么样呢?其实Python中的函数参数所遵循的是传对象,或者叫做穿对象的引用。在调用函数时,将变量整个对象传入,对于可变对象的修改,在函数内外均可见;而对于不可变对象,因为其并不能真正意义上被赋值,修改是通过生成新的对象来实现的。下面来一个有趣的例子作为结尾:>>>defbar(a=[]):...printid(a)...a.append(7)...printa>>>for_inrange(5):...bar#结果输出请自己动手实践,原因应该不难理解

尚琳

1、你的dayin(object)传了一个对象,去掉。

2、你在初始化函数__init__里面写了参数,所以你在下面m=dayin必须加参数。我是直接去掉了。默认为""

3、你的变量和函数名称重复,下面调用时会有问题。所以我修改了。

相关的问题
  • python通过键盘将多个值赋给变量

    python实现同时给多个变量赋值的方法这篇文章主要介绍了python实现同时给多个变量赋值的方法,涉及Python中变量赋值的相关技巧,非常具有实用价值,分享给大家供大家参考。具体分析如下python中可以同时给多个变量赋值,下面列举了三种方法#

  • js通过ajax连接python变量

    js是前端脚本,可以通过ajax让后端的服务器调用python脚本,然后返回处理结果。前端直接调用任何本地文件都是不安全也是不推荐的

  • python通过变量找对应列表

    你可以考虑遍历一下所有的key,然后在value匹配的时候break。:Ifdict[key]==value:print(key)print(value)break