传值python
㈠ cmd怎么往python中传参数
假如复你写了一个文件test.py,你需要三制个参数,你运行时:
python test.py arg1 arg2 arg3
在test.py中读取这几个参数:
#!/bin/python
import sys
print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)
这样会给出输出:
Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']
不知道你要问的是不是这个。
㈡ python如何将值传递参数
python将值传递参数的方法:
将值赋给变量url,然后调用函数,将内url写到函数名后面的括号中,这样就容可以将值传递给函数的参数y了
示例代码如下:
执行结果如下:
更多Python知识,请关注:Python自学网!!
㈢ python传入参数的问题
python在定义函数的时候,存在两种特殊定义,*和**的传值方式,正是因为这两种定义,python 函数的传值,非常灵活,在cpp编程的时候,不支持方法重载,因为没必要了。。。
在参数前面加个*号,表明这个函数会将这个变量代表的内容,转换为一个元祖,所以函数可以接收N个元素,这N个元素在函数里面转成一个元祖。比如这种
deffun1(*a):#定义
print(a)#1输出
print(*a)#2输出
x=[1,2,3]
fun1(x)#1调用
fun1(*x)#2调用
fun(1,2,3)#3调用
因为fun1定义的时候,告诉函数,x可以接受N个对象,这个对象在函数里面会转成一个元祖保存,所以在1调用的时候,x在fun1函数里面会被当成一个元祖,但我们知道,x其实是一个元祖,1调用的时候,就传了一个对象进去。所以,结果如下
([1,2,3],) #1输出
[1,2,3] #2输出
为啥?1输出,清楚无误的告诉print(print也是函数,也支持*args方式传值),你直接把a对象打印出来,a对象是啥?一个包含1个对象的元祖,所以就是(x,)这样的结果。那2输出呢?2输出在调用的时候,在a对象前面已经拆解了元祖,所以,传给print函数的,是一个对象,就是x了。
同理,在2调用的时候,因为x对象被拆开,所以,func1被传入多个值,此时的a是一个元素和x相同的元祖。所以2调用的1输出,就是一个值,就是(1,2,3)。2输出,因为被拆解了再传给print,所以,print其实被传入了多个值,然后将这些值全部打印出来,所以结果是1,2,3.
那3调用呢?其实本质和2调用是一样的
那双星号呢?双星号是拆解key-val格式对的内容,在函数定义的时候,是默认讲传入的产生转为字典。而规律和上面说的单星号一致。如果用单星号去拆解key-val对象,只会拆解出key。后面的就不多说了。
为啥单引号拆解key-val对象,可以拆出key呢。。。源代码就这么执行的,为啥当初设计,理由是啥。。。不清楚。。
㈣ python函数传参是传值还是传引用
那要看数据类型了,int,float,str这种就是传值,list,dict,类的实例,自定义对象都是穿引用。
下面是示例代码:
defchange(int1,float1,str1,dict1,obj1,list1):
int1+=1
float1+=1
str1+='changed'
dict1['none_exist_key']='none_exist_value'
obj1=None
list1.append('change')
classobj:
pass
int1=0
float1=0.0
str1='origin'
dict1={'key':'value'}
obj1=obj()
list1=['only_element']
print(int1)
print(float1)
print(str1)
print(dict1)
print(obj1)
print(list1)
change(int1,float1,str1,dict1,obj1,list1)
print('afterchange')
print(int1)
print(float1)
print(str1)
print(dict1)
print(obj1)
print(list1)
㈤ python 传参数cmd怎么往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 mole __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');
㈥ Python 不同脚本之间传值问题
看你的需求,应来该是需要显示def2被执自行。只需要print "def2"就可以了。
你可能理解有些误差,当py2被执行时,py1的模块是被导入到py2中,所以对于py2来说,它与py1没有什么关系。只是把py1的功能拿来用。拿来后就属于py2了。只在一个进程里执行,就象是py2自己的一样。这就是PYTHON的特点。
另外顺便说一下。如果你这样循环执行。几乎1秒钟,系统的栈就满了。很可能执行不下去了。
㈦ Python 的函数是怎么传递参数的
首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的专关联实现的属。
对于你的代码:
执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。
执行函数add(d)过程中:
d被传递给add()函数后,在函数内部,num也指向了__main__中的2
但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。
如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变。因此,你打印d时得到了2。
如果你想让输出为12,最简洁的办法是:
在函数add()里增加return num
调用函数时使用d = add(d)
代码如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d
㈧ python怎么向类中的函数传递参数
我再补充一下:直接写个例子,看注释就能明白
class Person:
#有时写作Person(object):
#表示继承object中的一些方法回(如__init__等)
#在python3中没区别,已答经默认继承了
def __init__(self, init_name):
self.name = init_name
def greet(self):
print('Hi, my name is %s' %self.name)
p1 = Person('David')
#这个David传参比较特殊,因为是传给init初始化方法,所以可以直接写在类后面
#一般我们需要给类中定义的方法或属性赋值的时候,用的是.访问,而不在创建类对象时传参
p1.greet()
㈨ Python 函数中,参数是传值,还是传引用
这个问题的答案无外乎这几种说法:传值,传引用,对于可变对象是传引用,不可变对象是传值。
传引用
先看下面这个例子:
>>> def foo(n):
... print id(n)
... n = 3
... print id(n)
>>> n = 2
>>> id(n)
31030000L
>>> foo(n)
31030000L
31029976L
>>> n
2
>>> id(n)
31030000L
由foo中两次输出不相等可以看出,传引用说法并不成立。
传值
来看下面的例子:
>>> def foo(n):
... print n
... n.append(3)
... print n
>>> n = [1, 2, 4, 8]
>>> foo(n)
[1, 2, 4, 8]
[1, 2, 4, 8, 3]
>>> n
[1, 2, 4, 8, 3]
按传值的说法,一个值传进来,在函数内改动并不会影响变量本身的值,上面例子中n变量本身的值也被改变了,说明传值的说法也不对。
3.可变对象传引用,不可变对象传值
相比上面两种说法,这种说法似乎更靠谱,传播也更为广泛,那它到底对不对呢?
>>> def foo(n):
... print id(n)
... n = ['1', '2', '3']
... print id(n)
... print n
>>> n = [1,2,3,4,5,6]
>>> id(n)
35637576
>>> foo(n)
35637576
35916168
['1', '2', '3']
>>> n
[1, 2, 3, 4, 5, 6]
按照可变对象传引用的说法,上面list类型是可变对象,应该传引用,这foo方法中两次调用id应该输出一样的值,更改的结果也应该影响到外部变量,但结果显然不是这样的,这说明,这种说法也是不正确的。
那么Python传值的方法到底是什么样呢?其实Python中的函数参数所遵循的是传对象(call by object),或者叫做穿对象的引用(call by object reference)。在调用函数时,将变量整个对象传入,对于可变对象的修改,在函数内外均可见;而对于不可变对象,因为其并不能真正意义上被赋值,修改是通过生成新的对象来实现的。
下面来一个有趣的例子作为结尾:
>>> def bar(a = []):
... print id(a)
... a.append(7)
... print a
>>> for _ in range(5):
... bar()
#结果输出请自己动手实践,原因应该不难理解