Luckylau's Blog

你懂python吗(1)

Python的函数参数传递

示例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def test(c):
print "test before"
print id(c)
c=2
print "test after"
print id(c)
return c
if __name__ == '__main__':
a=1
print "main before"
print id(a)
test(a)
print "main after"
print id(a)
print a
# output
main before
12460376
test before
12460376
test after
12460352
main after
12460376
1

示例二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def test(c):
print "test before"
print id(c)
c.append(1)
print "test after"
print id(c)
return c
if __name__ == '__main__':
a=[]
print "main before"
print id(a)
test(a)
print "main after"
print id(a)
print a
#output
main before
139625132046312
test before
139625132046312
test after
139625132046312
main after
139625132046312
[1]

示例三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def test(c):
print "test before"
print id(c)
c=[2,3]
print "test after"
print id(c)
return c
if __name__ == '__main__':
a=[1]
print "main before"
print id(a)
test(a)
print "main after"
print id(a)
print a
# output
main before
139900695660520
test before
139900695660520
test after
139900695661672
main after
139900695660520
[1]

总结:

​ 对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。对于不可更改对象而言一定是“值传递”引用,如示例一;对于可更改对象也可以“值传递”,如示例三;对于示例二,传入的是可变对象,并且函数对其进行操作,属于“引用传递”。

函数参数的定义有四种形式:

F(arg1,arg2,…)

F(arg2=,arg3=…)

F(*arg1)

F(**arg1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def test(x,y=5,*a,**b):
print x,y,a,b
if __name__ == '__main__':
test(1)
test(1, 2)
test(1, 2, 3)
test(1, 2, 3, 4)
test(1, 2, (3, 4),5)
test(1, 2, 3, 4, 5,a=2)
test(x=1)
test(x=1,y=2)
test(x=1,y=2,a=3)
test(x=1,y=2,a=3,b=4)
test(x=1, y=2, a=3, b=4,c=5)
test(1, 2, z=1)
test(1, 2, 3, a=1)
test(1, 2, 3, 4, a=1)
test(1, 2, 3, 4, a=1, b=2, c=3)
#output
1 5 () {}
1 2 () {}
1 2 (3,) {}
1 2 (3, 4) {}
1 2 ((3, 4), 5) {}
1 2 (3, 4, 5) {'a': 2}
1 5 () {}
1 2 () {}
1 2 () {'a': 3}
1 2 () {'a': 3, 'b': 4}
1 2 () {'a': 3, 'c': 5, 'b': 4}
1 2 () {'z': 1}
1 2 (3,) {'a': 1}
1 2 (3, 4) {'a': 1}
1 2 (3, 4) {'a': 1, 'c': 3, 'b': 2}

首先按顺序把“arg”这种形式的实参给对应的形参;

第二,把“arg=”这种形式的实参赋值给形参;

第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参;

第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。

Luckylau wechat
如果对您有价值,看官可以打赏的!