2017-04-05 27 views
4

我想在Python中编写一个线性同余生成器,我找到一小段code on Wikipedia,但在理解它时遇到了一些困难。代码如下:Python中的函数

def lcg(modulus, a, c, seed=None): 
    if seed != None: 
     lcg.previous = seed 
    random_number = (lcg.previous * a + c) % modulus 
    lcg.previous = random_number 
    return random_number/modulus 
lcg.previous = 2222 

我的问题是,什么是“lcg.previous”?我注意到该功能已完成,lcg.previous的值被更新并存储。它在这里声明为函数lcg()的成员变量,还是实际上为python中的所有函数设置了某种默认类型?

非常感谢!

+0

也许你可以给你提供代码片段的参考。 – Alex

+0

我想你没有复制所有相关的代码,并且lcg.previous在函数定义之后直接设置为一个起始值。 –

+0

对不起,我碰巧上传了我编辑过的版本。感谢您的编辑。 – Xuan

回答

5

它是该函数的“成员变量”,所以每次调用该函数时(除用seed的某些东西调用该函数外),该序列都会选择该函数的剩余位置。

+0

+1。作为一个注释,通过这个,你可以模拟其他语言中常见的'static'函数变量的行为,如C. –

+0

感谢您的解释。 – Xuan

0

Python将lcg.previous识别为一个新的变量声明,并将其作为一个成员添加到lcg中。

+0

Python没有变量声明。 –

+0

它的确如此,这只是暗示。行lcg(modulus, a, c, seed=None):暗含了模数a,c和种子的局部变量声明。行lcg.previous是一个成员变量的隐含声明。 Python只是抽象地声明了引用变量下面那些坚韧不拔的部分。 – Stephan

+1

Python是语言,没有变量声明。变量[弹出](https://docs.python.org/3/tutorial/classes.html#instance-objects)分配给它们时。变量声明的语言结构在Python中并不存在,就像在C,C++,Java等中一样。Python中只有赋值。你用术语松散。 –

0

previous变量是lcg函数的一个属性。在这个例子中,它被用作lcg函数的静态变量。由于Python不需要在使用前声明变量(或对象成员),所以可以根据需要创建它们。在这种情况下,您创建了lcg函数对象的成员previous