Python构造函数参数不是随机错误



我最近刚刚发现了这个奇怪的Python"bug",我想看看是否有人知道更多!

例如,以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中的默认参数在创建函数时只计算一次。要解决此问题,请尝试:

    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() 

最新更新