在python中观察变量?

时间:2015-06-22 17:53:43

标签: python reference

在C ++中,我可以想象使用对计数器的引用进行构造(见下文),然后函数只是取消引用地址以获取值。 python中有类似的东西吗?

类似的东西:

import time
class Count_Watcher:

    def __init__( self, to_watch ):

        self.to_watch = to_watch
        sleep_watch()

    def sleep_watch( self ):

        time.sleep( 5 )
        print( self.to_watch )

line_counter = 0
separate_thread_printer = Count_Watcher( (?some operator) line_counter )

for line in some_file:
    line_counter += 1

和"当前"每隔五秒打印line_counter的值(如for循环中的当前值)

2 个答案:

答案 0 :(得分:1)

您可以通过将变量包装到列表中来实现,如下所示,因为所有引用都指向列表的同一个实例

import time
class Count_Watcher:

    def __init__( self, to_watch ):

        self.to_watch = to_watch
        self.sleep_watch()

    def sleep_watch( self ):

        time.sleep( 5 )
        print( self.to_watch[0] )

line_counter = [0]
separate_thread_printer = Count_Watcher(line_counter)

for line in some_file:
    line_counter[0] += 1

答案 1 :(得分:1)

原始int不起作用,但是当k4vin指出时,可以引用的任何其他类型的对象都会。

我们可以使用包含计数的列表来证明这一点,正如k4vin所做的那样:

class Watcher(object):
    def __init__(self, to_watch):
        self.to_watch = to_watch

    def print_current_value(self):
        print self.to_watch

i = 0
watcher = Watcher(i)
watcher.print_current_value()
# prints 0
i += 3
watcher.print_current_value()
# still prints 0

l = [0]
watcher = Watcher(l)
watcher.print_current_value()
# prints [0]
l[0] += 3
watcher.print_current_value()
# prints [3]

但是将你的计数保存在一个列表中有点笨拙,所以一个选项就是滚动你自己的简单计数器,然后你可以引用它(就像列表一样):

class Counter(object):
    def __init__(self):
        self.count = 0

    def __add__(self, incr):
        self.count += incr

    def __str__(self):
        return str(self.count)

c = Counter()
watcher = Watcher(c)
watcher.print_current_value()
# prints 0
c += 3
watcher.print_current_value()
# hooray! prints 3