如果语句被调用,即使条件已满足,也要忽略

时间:2017-04-18 13:21:42

标签: python

我的代码中有一个简单的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

2 个答案:

答案 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定义为全局。否则,您只能阅读它。