UnboundLocalError:int vs lis

2024-03-28 11:07:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这个错误消息已经被讨论了很多,但我还没有找到以下解释:

def random2(seed):
    x = seed
    def update():
        x = ( x * 16807 ) % 2147483647
        return x
    return update

r = random2(17283945)
print(r())

这不起作用,因为返回函数[UnboundLocalError]会丢失变量x的作用域。好 啊。但现在我发现这绝对没有问题

def random(seed):
    x = [seed]
    def update():
        x.append(( x.pop() * 16807 ) % 2147483647 )
        return x[0]
    return update

r = random(17283945)
print(r()) #580971270
print(r()) #1923475628
print(r()) #1783541505

我有点困惑,为什么在这种情况下,x的作用域仍然有效。这似乎与(im)易变性有关,但这对我来说仍然没有多大意义。你知道吗

非常感谢。你知道吗


Tags: 函数消息returndef错误情况updaterandom
3条回答

当您在变量名后面放置赋值运算符(=)时,该变量将自动假定为局部变量。因为你试图在赋值之前引用它,所以你得到了错误。你知道吗

在第二个示例中,您从未将变量x赋给任何对象,只是对其进行了适当的变异。你知道吗

@volatile已经解释了为什么会发生这种情况,但为了便于参考,您可以编写一个类似的函数,避免使用生成器嵌套作用域。你知道吗

def random(seed):
    x = seed
    while True:
        x = ( x * 16807 ) % 2147483647
        yield x

当像for rand_num in random(100)一样迭代时,这将给您一个伪随机数序列。您还可以根据需要获取新的随机数,而无需使用for循环:rand_gen = random(100); rand_num = next(rand_gen)。你知道吗

您可以看到随机数生成器是生成器的一种自然用法:函数更短、更清晰,可以以自然的方式(for...innext)使用,并且不太容易出现由于nonlocal而产生的错误。有关生成器和yield的更好解释,请参见this question。你知道吗

如果您使用的是python3,那么可以使用nonlocal x

def random2(seed):
    x = seed
    def update():
        nonlocal x
        x = ( x * 16807 ) % 2147483647
        return x
    return update

r = random2(17283945)
print(r())

在python2中,我总是像你那样处理列表。你知道吗

相关问题 更多 >