python的默认参数,关于python的默认参数

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:51   4188   0

首先从函数的定义开始理解

****命题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的赋值机制

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP