Python:默认参数

Python是个人最喜欢的语言,刚开始接触Python时,总觉得有很多槽点,不太喜欢。后来,不知不觉中,就用的多了、习惯了、喜欢上了。Python的功能真的很强大,自己当初学习这门语言的时候,也记录过很多的笔记,现慢慢把这些笔记发布出来,希望对大家有所帮助,对自己也算是一个总结。

关于Python默认参数,假如默认参数是可变对象是会有副作用的,这一点我一开始不是很理解,直到有一天,看到一篇博文说:一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数第一次被定义的时候,才讲参数的默认值初始化到它的默认值(如一个空的列表)。
听到这个解释,豁然开朗,解释器试验如下:

 1 >>> def f(x = []):
 2     print(id(x))
 3     x.append(1)
 4     print x
 5     print(id(x))
 6
 7
 8 >>> f()
 9 38869952 # 可变默认参数是在原地更改!!!
10 38869952
11 >>> f()
12 38869952 # 再次调用时,可变默认参数还是引用最初定义的!!!
13 38869952
14 # 注意,默认参数是在定义时赋值,且仅仅赋值一次。
15 # 当函数多次被调用,并且没有提供默认的参数值,就会从定义时赋值的地方取得值!
16 # 即使函数中给默认参数重新赋值了,下次调用还是会从定义赋值的地方取得值!
17 # 如以下的示例:当f2()多次调用,虽然在函数体里面给y重新赋值了,但是下次调用时
18 # 再次打印print id(x) 的结果也还是一样的!
19 # 所以:
20 # 1. 假如默认参数是可变对象,则会在原处直接更改对象,下次调用参数时,默认参数已经
21 # 更改过的了。如f()函数。
22 # 2. 假如默认参数不可变,那么给函数中给 参数赋值时,参数会引用内存的其他地方。下次函数调用时
23 # 默认参数还是从定义时赋值处取得值,因此没有副作用!
24 >>> def f2(y = None):
25     print(id(y))
26     if not y:
27         y = []
28     y.append(1)
29     print(id(y))
30
31
32 >>> f2()
33 505672708   # 定义时默认参数引用这一块内存。
34 38888872    # 函数体内赋值后,y引用其他地方。
35 >>> f2()
36 505672708    # 再次调用,y还是引用定义时赋值的内存处。
37 43910728     # 函数体内赋值后,y引用其他地方。
38 >>> f()
39 38869952
40 38869952
41 >>> f2()
42 505672708
43 43909408
44 >>> f2()
45 505672708
46 38868752
47 >>>
时间: 2024-08-08 16:59:00

Python:默认参数的相关文章

Python 默认参数

定义默认参数 定义函数的时候,还可以有默认参数. 例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数: >>> int('123') 123 >>> int('123', 8) 83 int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数. 可见,函数的默认参数的作用是简化调用,你只需要把必须的参数传进去.但是在需要的时候,又可以传入额外的参数来覆盖默认参数值. 我们来定

python默认参数陷阱

对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而且非常惊人(对于新手来说): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 实际上,这不是设计缺陷

python函数中的默认参数问题

Python 函数中,参数的传递本质上是一种赋值操作 def foo(arg): arg = 2 print(arg) a = 1 foo(a) # 输出:2 print(a) # 输出:1 def bar(args): args.append(1) b = [] print(b)# 输出:[] print(id(b)) # 输出:4324106952 bar(b) print(b) # 输出:[1] print(id(b)) # 输出:4324106952 def foo(x, a_list=

Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic(a, b, c): if not isinstance(a, (int, float)) or not isinstance(b, (int, float)) or not isinstance(c, (int, float)): raise TypeError('bad operand type

C/C++ Python的函数默认参数

发现C/C++  Python的函数可以使用默认参数,来减少传参时候的参数个数. 但是:这样的默认参数最好是不变对象! #include <stdio.h> #include <string.h> void func_1(int id, char s[], char city[] = "Bejing") { printf("%d, %s, %s",id, s, city); } int main() { func_1(1, "李金旭

python 当list,dic作为默认参数的坑爹之处

先看代码: def foo(a, b =[]): b.append(a) print b foo(1) foo(2) 结果想象中是: >>> [1] [2] >>> 实际上是: >>> [1] [1, 2] >>> 查看官方文档:https://docs.python.org/2.7/tutorial/controlflow.html#default-argument-values The default values are eva

[Python] partial改变方法默认参数

Python 标准库中 functools库中有很多对方法很有有操作的封装,partial Objects就是其中之一,他是对方法参数默认值的修改. 下面就看下简单的应用测试. #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orangleliu ''' functools 中Partial可以用来改变一个方法默认参数 1 改变原有默认值参数的默认值 2 给原来没有默认值的参数增加默认

我爱Python之位置参数、关键字参数、默认参数

1.位置参数: >>> def check_web_server(host, port, path): print .... >>> check_web_server('www.python.org', 80, '/') 三个参数的顺序必须一一对应,且少一参数都不可以 2.(函数调用里的)关键字参数: 可以让函数更加清晰.容易使用,同时也清除了参数的顺序需求,关键字参数通过“键-值”形式加以指定,用于函数调用 >>> check_web_server(

[python 函数学习篇]默认参数

python函数: 默认参数: retries=4 这种形式 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retri