关于python的默认参数

首先从函数的定义开始理解
****命题1: ****函数的定义不会引起函数内部代码的执行

def a():
    print "a executed"
    return 1

看下面这个函数, 函数内部是错误的, 不过没关系, 根据命题1, 函数内部代码不会执行

def b(x = a()):
    x.append(5)
    print x
a executed

但是函数b在定义的时候, 函数a被执行
修改函数b:

def b(x = a()):
    return x + 1
a executed
def c(r):
    print r, "at", id(r)

x = b()
c(x)
y = b()
c(y)
z = b()
c(z)
2 at 25485664
2 at 25485664
2 at 25485664

**命题2 **每个具有相同的值的NAME, 或者TAG, 内存地址一样
证明如下:

o = 1
p = 1
q = 1
print id(o)
print id(p)
print id(q)
25485688
25485688
25485688

即使是deepcopy(i don't care about what deepcopy() does)之后(注意看o, p, q的内存地址)

import copy
n1 = 1
n2 = copy.deepcopy(n1)
print id(n1)
print id(n2)
25485688
25485688

另外, 有关mutable, immutable的定义, 这里不做介绍
此外, 本文并不是科普文, 不会详细介绍每一个概念, 所以如果你因为我没有讲清楚而埋怨, 请记住我只意在讲述以下结论
1, immutable类型的客体(我不把object翻译成对象)由于函数设定而需要被改变的时候, 编译器会分配一块新的内存来存储改变后的对象
2, immutable客体在任何scope内存的地址都一样(证明如下)

num = 10
print id(num)
def func():
    l_num = 10
    print id(l_num)
func()
25485472
25485472

关于mutable客体

它们的地址是不固定的, 每次运行以下代码都会得到不同结果
根据python的赋值机制, 要追踪一个mutable客体, 给它挂上一个TAG, 以下例子中TAG是flxbl

print id([])
print id([])
print id([])
print "-"*50
print id([1])
print id([1])
print id([1])
print "-"*50
flxbl = []
print id(flxbl)
print id(flxbl)
print id(flxbl)
140053251742320
140053251965728
140053251524368
--------------------------------------------------
140053251524368
140053251965728
140053251524368
--------------------------------------------------
140053251524368
140053251524368
140053251524368

rambling are located mutable objects, they are not unique, they are scattered everywhere

以上结论表明: 如果你在默认参数上出现问题, 那么问题并不是出在函数的定义, 而是由于你不理解python的赋值机制

你可能感兴趣的:(关于python的默认参数)