我知道这个错误消息已经被讨论了很多,但我还没有找到以下解释:
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)易变性有关,但这对我来说仍然没有多大意义。你知道吗
非常感谢。你知道吗
当您在变量名后面放置赋值运算符(
=
)时,该变量将自动假定为局部变量。因为你试图在赋值之前引用它,所以你得到了错误。你知道吗在第二个示例中,您从未将变量
x
赋给任何对象,只是对其进行了适当的变异。你知道吗@volatile已经解释了为什么会发生这种情况,但为了便于参考,您可以编写一个类似的函数,避免使用生成器嵌套作用域。你知道吗
当像
for rand_num in random(100)
一样迭代时,这将给您一个伪随机数序列。您还可以根据需要获取新的随机数,而无需使用for循环:rand_gen = random(100); rand_num = next(rand_gen)
。你知道吗您可以看到随机数生成器是生成器的一种自然用法:函数更短、更清晰,可以以自然的方式(
for...in
和next
)使用,并且不太容易出现由于nonlocal
而产生的错误。有关生成器和yield
的更好解释,请参见this question。你知道吗如果您使用的是python3,那么可以使用
nonlocal x
在python2中,我总是像你那样处理列表。你知道吗
相关问题 更多 >
编程相关推荐