Почему этот метод, переопределенный во время выполнения, не сохраняет свое значение?

python python-3.x global-variables

24 просмотра

1 ответ

Я застрял на чем-то, что, я подозреваю, довольно просто, но я просто не могу обернуть голову вокруг этого. Я пытаюсь создать класс с методом, который можно переопределить на лету. Я хочу быть в состоянии сделать это для произвольного числа случаев, но я показываю здесь только два, чтобы упростить задачу.

Вот MWE моего кода:

class Foo():
    def __init__(self, z):
        self.z = z

    def f(self, t):
        return 0

def f(obj1, obj2, t):
    return (obj1.z - obj2.z) * t

a, b = Foo(3), Foo(5)
print(a.f(1), b.f(1)) # --> 0, 0

x, y = a, b
x.f = lambda t: f(x, y, t)
print(a.f(1), b.f(1)) # --> -2, 0

x, y = b, a
x.f = lambda t: f(x, y, t)
print(a.f(1), b.f(1)) # --> 2, 2

Почему ценность a.f(1)изменения?

Автор: dulrich Источник Размещён: 08.11.2019 11:03

Ответы (1)


0 плюса

Решение

Она меняется , потому что вы модифицирования xи yглобальные переменные, которые переданы в fфункции вы определили:

In [2]: a, b = Foo(3), Foo(5)

In [3]: print(a.f(1), b.f(1))
0 0

In [4]: x, y = a, b
   ...: x.f = lambda t: f(x, y, t)
   ...: print(a.f(1), b.f(1))
   ...: 
-2 0

In [5]: x, y = b, a 

In [6]: print(a.f(1), b.f(1))  # you changed x and y
2 0

После того, как вы поменялись xи у yвас есть, a.fэто функция, lambda t: f(x, y, t)которая означает, что она вызывает, f(b, a, t)и с тех пор, b = Foo(5)и у a = Foo(3)вас есть 5-3 == 2вместо -2.

Если вы хотите исправить передаваемое значение fи «отсоединить» его от глобальных переменных, вы можете использовать аргументы по умолчанию:

In [2]: x, y = a, b
   ...: x.f = lambda t, x=x, y=y: f(x, y, t)
   ...: 

In [3]: print(a.f(1), b.f(1))
-2 0

In [4]: x, y = b, a

In [5]: print(a.f(1), b.f(1))
-2 0

Поскольку значения по умолчанию оцениваются во время определения, при использовании lambda t, x=x, y=yвы в конечном итоге фиксируете значения xи yкак они были, когда функция была определена, чтобы при последующем обмене ими это не влияло на эту функцию.

Автор: Bakuriu Размещён: 20.08.2016 08:31
Вопросы из категории :
32x32