在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循环中的当前值)
答案 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