
正文
函数引用Python 函数引用正确的是
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python 引用
python引用有哪些函数引用Python?来和我一起解读一下吧~
python不允许程序员用传值和传引用函数引用Python,可以选择选用“传对象引用”的方式,这种方式等同于将传值和传引用综合起来,如果函数收到的是一个可变对象的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象,如果函数收到的是一个不可变对象的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象。
python引用主要有函数引用Python:不可变数据引用和可变数据引用,其中不可变数据引用包括:字符串String、浮点型Float、元祖Tuple。
1、字符串String
#1.字符串引用 a='1234' b=a a='hello' print('a:',a) #a:hello print('b:',b) #b:1234 #查看内存地址 print('a的内存地址是:',id(a)) print('a的内存地址是:',id(b)) 结果是: a: hellob: 1234a的内存地址是: 1651738050720a的内存地址是: 1651737219456 分析:b的值指向a的值。python开辟了新的内存空间给b,所以a和b的内存地址不一样。
2、浮点型Float
#2.浮点型引用 x=3.14 y=x x=9.88 print('x:',x) print('y:',y) print('x的内存地址是:',id(x)) print('y的内存地址是:',id(y)) 结果是: x: 9.88y: 3.14x的内存地址是: 2578075558248y的内存地址是: 2578075558008
3、元祖Tuple
元祖虽然是序列,且包含多个元素,但是不支持原处修改,如tuple[1]=1是非法的。#3.元祖引用 t1=(1,2,3,4,5) t2=t1 t1=('tuple','hello') print('t1:',t1) print('t2:',t2) print('t1的内存地址是:',id(t1)) print('t2的内存地址是:',id(t2)) 结果是: t修改后为: (1, 2, 3, ['x', 'a', 'D', 'b']) 可变数据引用包括:列表引用、字典引用、函数的传递引用
1、列表引用
#4 列表的可变引用 list1=[1,2,3,4,5] list2=list1 list1[3]='list' print('list1=====%s'%list1) print('list2=====%s'%list2) print('list1的内存地址是:',id(list1)) print('list2的内存地址是:',id(list2)) 结果是: list1=====[1, 2, 3, 'list', 5]list2=====[1, 2, 3, 'list', 5]list1的内存地址是: 2769992249864list2的内存地址是: 2769992249864
2、函数的传递引用
def eggs(someParameter): someParameter.append('hello list') spam=[1,2,3,4] eggs(spam) print(spam) 结果是: [1, 2, 3, 4, 'hello list']
3、字典引用 #5 字典的引用 a={'name':'Cathy','age':'27','job':'coder'} b=a a['age']='30' b['name']='Bob' print('a======%s'%a) print('b======%s'%b) print('a的内存地址是:', id(a)) print('b的内存地址是:', id(b)) 结果是: a======{'name': 'Bob', 'age': '30', 'job': 'coder'} b======{'name': 'Bob', 'age': '30', 'job': 'coder'} a的内存地址是: 2510825602792 b的内存地址是: 2510825602792
相关问答
Q1: python如何定义和调用函数
1、函数定义
①使用def关键字定义函数
②
def 函数名(参数1.参数2.参数3...):
"""文档字符串,docstring,用来说明函数的作用"""
#函数体
return 表达式
注释的作用:说明函数是做什么的,函数有什么功能。
③遇到冒号要缩进,冒号后面所有的缩进的代码块构成了函数体,描述了函数是做什么的,即函数的功能是什么。Python函数的本质与数学中的函数的本质是一致的。
2、函数调用
①函数必须先定义,才能调用,否则会报错。
②无参数时函数的调用:函数名(),有参数时函数的调用:函数名(参数1.参数2.……)
③不要在定义函数的时候在函数体里面调用本身,否则会出不来,陷入循环调用。
④函数需要调用函数体才会被执行,单纯的只是定义函数是不会被执行的。
⑤Debug工具中Step into进入到调用的函数里,Step Into My Code进入到调用的模块里函数。
Q2: Python中函数调用是传值还是传引用
python不允许程序员选择采用传值还是传引用。Python参数传递采用函数引用Python的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用函数引用Python,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用函数引用Python,就不能直接修改原始对象--相当于通过“传值'来传递对象。
Q3: python中怎么在一个函数内调用另外一个函数,类
今天遇到同样的问题,就来答一波吧
1,如果是在类中,那么就很简单了,类中的一个函数调用另一个函数,只要在那个被调用的函数前加self即可(图如下,详细可以参考笔者博客),
2,如果不是在类中,(这是笔者遇到的问题),有一个简单的方法,如下sin_f函数调用sin函数(注:a=sin()不能写到sin_f()函数下,会说a没声明就调用):
3,如果是已经存在的包,那么调用包更简单了,(同样可以参考笔者上面给的那个博客第四部分)
4,最后,更多关于python问题可以参考笔者的python教程笔记
Q4: 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');
Q5: Python中 自己定义的函数内生成的列表 怎么在外部中引用?
下面的例子演示了用3种方法来在外部引用函数内部定义的列表:
#返回函数内部定义的列表
def int_list1():
l=[1,2]
return l
#将函数内部列表定义成全局的
def int_list2():
global l
l=[3,4]
#将函数内部列表定义成函数的一个属性
def int_list3():
l=[5,6]
int_list3.l=l
print(int_list1())
int_list2()
print(l)
int_list3()
print(int_list3.l)
这是截图:
函数引用Python的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于函数引用正确的是、函数引用Python的信息别忘了在本站进行查找喔。







