我的代码中有一个简单的if语句
if len(bootstrap_node_list_recieved_no_dups) >= min_node_to_complete_boot_strap:
print "recieved required nodes"
基本上我想知道是否有足够的节点,我只希望这种情况发生一次,因为代码仍然会继续运行并重复运行,因此目前这个if语句每次都按照我的预期运行。
有没有办法对它进行编码,以便if语句运行,但是一旦它完成,它永远不再运行?
>=
是必需的,因为输入不是常量。
我希望这很清楚,因为它有点难以描述。
更新
我已尝试实施建议,但收到错误
UnboundLocalError: local variable 'flag' referenced before assignment
以下完整代码:
flag = False
def number_of_duplicates_in_list():
number_recieved = len(bootstrap_node_list_recieved)
bootstrap_node_list_recieved_before = len(bootstrap_node_list_recieved_no_dups)
" this method works in O(n^2) time and is thus very slow on large lists"
for i in bootstrap_node_list_recieved:
if i not in bootstrap_node_list_recieved_no_dups:
bootstrap_node_list_recieved_no_dups.append(i)
assert len(bootstrap_node_list_recieved_no_dups) >= bootstrap_node_list_recieved_before
if len(bootstrap_node_list_recieved_no_dups) >= min_node_to_complete_boot_strap and flag is False:
print "recieved required nodes"
flag = True
答案 0 :(得分:2)
首次触发if
语句时,您可能会有一些标记变量被更改。下面的代码是一个最小的例子,它只会打印一次'Triggered'语句,即使所有大于3的数字都会触发语句,如果还没有检查该标志。
flag = False
for x in xrange(10):
if x > 3 and flag is False:
print 'Triggered'
flag = True
# Do something else
如果要在函数内执行此操作,还需要将标志初始化移动到函数中。请注意,重新运行该函数将重置标志:
def test_func():
flag = False
for x in xrange(10):
if x > 3 and flag is False:
print 'Triggered'
flag = True
# Do something else
test_func()
为了能够多次运行该函数但只触发if
语句并更改标志一次,您需要将该标志链接到函数调用。执行此操作的一种简单方法是在每次调用时传递并返回标志:
flag = False
def test_func(flag):
for x in xrange(10):
if x > 3 and flag is False:
print 'Triggered'
flag = True
# Do something else
return flag
flag = test_func(flag)
flag = test_func(flag)
这里,标志在函数外部定义,并在调用时传递给每个函数。如果没有触发,它会无变化地通过。如果被触发,它将被更改并且其状态将传回函数外部。
其他方法可能是定义global
变量或构建一个类,其中标志作为对象变量并通过self
访问它。
答案 1 :(得分:0)
在number_of_duplicates_in_list中将flag
定义为全局。否则,您只能阅读它。