python的构造函数参数不一样,Python构造函数参数不是随机的bug?

我最近发现了这只奇怪的Python"臭虫",我想看看是否有人知道更多关于它的信息!

例如,以python模块为例:

import random

class SaySomething:

def __init__(self, value=random.randint(1, 3)):

if value == 1: print 'one'

elif value == 2: print 'two'

elif value == 3: print 'three'

a = 0

while a < 10:

SaySomething()

a += 1

由于某种原因,此代码将打印相同的数字10次!!!!现在我不明白了。似乎连续10次使用相同的值调用构造函数。但是,如果您打印每个SaySomething(),您将看到它们都有不同的指针地址,因此它们不是同一个对象。

现在,如果您更改:

SaySomething()

SaySomething(random.randint(1, 3))

它按预期运行,并进行实际的随机选择。

有人知道为什么会这样吗?

默认参数问题再次出现!

哇,这是一堆快速而有用的回答!我希望我能说你们都回答了我的问题!多亏了所有帮助过的人,现在很有意义了。

python构造函数的可能副本使用可选参数执行奇怪的操作

问题是,在创建函数时,python中的默认参数只计算一次。要解决此问题,请尝试:

def __init__(self, value = None):

if value is None:

value = random.randint(1, 3)

if value == 1: print 'one'

elif value == 2: print 'two'

elif value == 3: print 'three'

这样,我们将随机化转换为函数本身,而不是在函数定义时。

在python中,默认参数初始化一次。因此,您一次又一次地得到相同的值,因为这是初始化默认参数时的值。参见http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/

这是因为当编译或解释类时,变量value的值被设置为random.randint(1, 3),并且在传递其他值之前它不会改变。

与在python构造函数中使用可选参数做奇怪的事情的原因相同

可选参数的默认值是单个实例,因此对于正在生成的所有实例,只计算一次。

要解决这个问题:

import random

class saySomething:

def __init__(self, value = None):

random_value = random.randint(1, 3) if value == None else value

if random_value in [1, 2, 3] print ['one', 'two', 'three'][random_value - 1]

for a in xrange(10):

saySomething()

你也可以做一个闭包,就像在def __init__(self, value=lambda: random.randint(1, 3)):中那样,但是对于这种情况来说,它没有多大意义;)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值