遇到一个奇怪的现象:
'''python
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print l
f(2)
f(3,[3,2,1])
f(3)
'''
讲道理来说输出应该是
'''python
[0,1]
[3,2,1,0,1,4]
[0,1,4]
'''
可是发现python不讲道理了
'''python
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
'''
一脸懵逼!
前两个能看懂,最后一个什么鬼?
找了一圈终于被我发现,要弄清楚这个问题得先弄清楚python函数默认参数时怎么工作的
'''python
def test(x,y=1):
print 'y的内存:%s' % id(y)
test(1)
test(2,1)
test(3,2)
test(4)
'''
输出:
'''python
y的内存:30832264
y的内存:30832264
y的内存:30832240
y的内存:30439048
'''
发现了什么?
对!y的内存不会随我们调用函数改变!除非你传入不一样的y的值!
搞清楚这一点之后还需要知道,列表不随它的扩大,减小而改变内存!
'''python
L = []
print id(L)
L.append(1)
print id(L)
'''
输出
39870344
39870344
懂了吧!
还不懂?
不管了!