首先从函数的定义开始理解
****命题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的赋值机制