更改某些变量的值后更改条件

时间:2019-01-16 12:06:42

标签: python

我有这种情况:最初设置为无的变量列表 A = [none, none, none, none] 还有一个非常简单的函数,用于控制2个值(无任何一个)是否不同:

def notEqual(a, b):
   if a is None and b is None:
       return True
   if a != b:
       return True
   return False

我想创建一个名为bigList的列表,该列表针对A的每对元素显示是否相等。所以我想这样做:

for i in range(4):
   for j in range(4):
      if i != j:
         c = ((i, j), (notEqual(A[i], A[j])))
         bigList.append((c))

因此,一开始,bigList的所有元素都是((i,j),(True)) 再过一会我遇到这种情况:

A[0]=10 A[1]=10

因此与(0,1)和(1,0)相关的条件必须更改为False。 有一种简单的方法可以执行这样的操作吗? (当某些变量更改其值时,请更改某些条件)

2 个答案:

答案 0 :(得分:0)

没有,没有办法。在大多数语言中,表达式是用变量的当前值求值的。您无法创建像not_equal(current_value_of_A, current_value_of_B)那样的表达式,该表达式在A和/或B的值更改时会自动更改。因此,您必须以某种方式重新运行代码。

做类似事情的常用方法是observer pattern。也就是说,将您的表达式包装在一个类中,并在某些值更改时通知该类。

此外,使用字典而不是列表,其形式为{(i,j): notEqual(A[i], A[j]),因此您可以仅更新单个(i,j)对,而无需重新运行整个代码。

答案 1 :(得分:0)

您可以使用python的 @propery 。它的工作方式类似于类似C#和JAVA的其他语言的getter。

根据您的情况,您可以使用吸气剂制作与((i, j), (notEqual(A[i], A[j])))类似的对象。

请参阅下面的示例实现

class bigListElement(object):
    A = [] # this is static
    def __init__(self, index_tuple, areEqual):
        self.index_tuple = index_tuple
        self._areEqual = areEqual

    @staticmethod
    def notEqual(a, b):
        if a is None and b is None:
            return True
        if a != b:
            return True
        return False

    @property
    def areEqual(self):
        return bigListElement.notEqual(bigListElement.A[self.index_tuple[0]], bigListElement.A[self.index_tuple[1]])


print("Hello World")

bigListElement.A = [10, 2, 10, 3, 4]
a = bigListElement((0, 1), False)

print(a.areEqual) # True

bigListElement.A[1] = 10

print(a.areEqual) # False