Передача переменной функции слушателя клавиатуры Pynput

У меня возникла проблема с передачей переменной count функции on_press, которая вызывается для каждого нажатия клавиши с использованием библиотеки прослушивателя pynput. Я не понимаю, почему переменная не увеличивается, а затем выводится на экран. Он увеличивает и выводит на первой итерации, но не на следующей. Я запутался, пожалуйста, помогите.

from pynput.keyboard import Listener
import string

count = 0 

def on_press(count):
    count += 1
    print(count)

with Listener(on_press=on_press(count)) as listener:
    listener.join()

person mamaluigie    schedule 17.12.2020    source источник


Ответы (1)


Проблема здесь связана с областью видимости переменных. Переменная count, на которую ссылается переменная on_press, представляет собой аргумент count, передаваемый в функцию (не глобальная переменная count, определенная вне функции). Целые числа в Python передаются путем копирования в функцию (а не по ссылке). Итак, что происходит в вашем коде, так это то, что вы делаете копию глобальной переменной count, передавая ее в on_press, а затем on_press увеличивает только переданную локальную копию count - следовательно, она всегда будет печатать 1.

Если вы хотите, чтобы count увеличивался при каждом вызове on_press, вы должны напрямую увеличивать глобальную переменную count следующим образом:

from pynput.keyboard import Listener
import string

count = 0 

def on_press():
    global count
    count += 1
    print(count)

with Listener(on_press=on_press()) as listener:
    listener.join()
person Stephen Mylabathula    schedule 17.12.2020
comment
Использование этого метода объявления глобального счетчика внутри функции и его увеличения делает то же самое, что и раньше, только с выводом 1 и без вывода чего-либо еще. Я тоже пробовал с ним возиться, и ничего не работает - person mamaluigie; 17.12.2020
comment
Большое спасибо!!! - person Joshua; 16.02.2021