Глобальные/локальные переменные Python

Почему этот код работает:

var = 0

def func(num):
    print num
    var = 1
    if num != 0:
        func(num-1)

func(10)

но это дает "локальную переменную" var ", указанную перед присваиванием" error:

var = 0

def func(num):
    print num
    var = var
    if num != 0:
        func(num-1)

func(10)

Ответ 1

Потому что в первом коде вы создали локальную переменную var и использовали ее значение, тогда как во втором коде вы используете локальную переменную var, не определяя ее.

Итак, если вы хотите, чтобы ваша вторая функция работала, вам нужно объявить: -

global var

в функции перед использованием var.

def func(num):
    print num
    var = 1  <--  # You create a local variable
    if num != 0:
        func(num-1)

Если в этом коде:

def func(num):
    print num
    var = var <--- # You are using the local variable on RHS without defining it
    if num != 0:
        func(num-1)

ОБНОВЛЕНИЕ: -

Однако, согласно комментарию @Tim, вы не должны использовать переменную global внутри ваших функций. Скорее уменьшите свою переменную перед ее использованием, чтобы использовать ее в local scope. Как правило, вы должны попробовать limit область ваших переменных в local и даже в local namespace limit область локальных переменных, потому что таким образом ваш код будет легче понять.

Чем больше вы увеличиваете объем своих переменных, тем больше шансов получить его от внешнего источника, где его не нужно использовать.

Ответ 2

Если у вас есть var = ... в любом месте функции, имя "var" будет рассматриваться как локальная переменная для всей функции, независимо от того, где происходит это присвоение. Это означает, что все вхождения var в вашей функции будут разрешены в локальной области, поэтому правая сторона var = var приведет к указанной выше ошибке присваивания, поскольку var еще не была инициализирована в области функций.

Ответ 3

Вы можете читать глобальное, не объявляя его глобальным. Но чтобы написать глобальный, вам нужно объявить его глобальным.

Ответ 4

В вашей второй части кода вы создали локальную переменную в RHS и не определяете ее, вы назначаете ее переменной LHS var, которая является глобальной (переменная, определенная вне функции, считается глобальной явно).

Если вы намерены создать локальную переменную внутри функции и присвоить ее значению глобальной переменной, это будет делать трюк:

var = 0

def func(num):
    print num
    func.var = var # func.var is referring the local
                   # variable var inside the function func
    if num != 0:
        func(num-1)

func(10)

Ответ 5

def runscan(self):
    p = os.popen('LD_PRELOAD=/usr/libv4l/v4l1compat.so zbarcam
                /dev/video0','r')

def input(self):
    self.entryc.insert(END, code)

как насчет этого? Я хочу использовать локальный "код" для следующей функции, чтобы вставить результат штрих-кода в мой Tkinter entryBox. Благодаря

Ответ 6

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

var = 0

def func(num):
    print num
    global var
    var = 1
    if num != 0:
        func(num-1)

print var # 0
func(2)
print var # 1