Python有像Perl 5.10的"状态"变量吗?

mik*_*ike 8 python perl

在Perl 5.10中,我可以说:

sub foo () {
  state $x = 1;
  say $x++;
}

foo();
foo();
foo();
Run Code Online (Sandbox Code Playgroud)

......它会打印出来:

1
2
3
Run Code Online (Sandbox Code Playgroud)

Python有这样的东西吗?

Ali*_*har 17

一个类可能更适合这里(并且通常更适合涉及"状态"的任何事情):

class Stateful(object):

    def __init__(self):
        self.state_var = 0

    def __call__(self):
        self.state_var = self.state_var + 1
        print self.state_var

foo = Stateful()
foo()
foo()
Run Code Online (Sandbox Code Playgroud)

  • tchrist:“重”是相对的。大多数用例永远不会注意到重量的差异。 (2认同)

Tri*_*ych 12

最接近的并行可能是将值附加到函数本身.

def foo():
    foo.bar = foo.bar + 1

foo.bar = 0

foo()
foo()
foo()

print foo.bar # prints 3
Run Code Online (Sandbox Code Playgroud)

  • 你不是刚刚创建了一个非私有变量!?天啊! (2认同)

小智 9

Python有一些类似的生成器:

"yield"关键字在Python中的作用是什么?


has*_*sen 8

不确定这是否是您正在寻找的,但是python的生成器函数本身不返回值,而是每次都生成新值的生成器对象

def gen():
   x = 10
   while True:
      yield x
      x += 1
Run Code Online (Sandbox Code Playgroud)

用法:

>>> a = gen()
>>> a.next()
10
>>> a.next()
11
>>> a.next()
12
>>> a.next()
13
>>> 
Run Code Online (Sandbox Code Playgroud)

在这里查看有关yield的更多解释:
"yield"关键字在Python中有什么作用?


pop*_*cnt 5

这是在python中实现闭包的一种方法:

def outer():
    a = [4]
    def inner():
        print a[0]
        a[0] = a[0] + 1
    return inner

fn = outer()
fn() # => 4
fn() # => 5
fn() # => 6
Run Code Online (Sandbox Code Playgroud)

我从python邮件列表帖子中逐字借用了这个例子.