Arhn - архитектура программирования

Понимание глобальной переменной в Python

Я столкнулся со странной проблемой в Python при использовании глобальных переменных.

У меня есть два модуля (файла): mod1.py и mod2.py

mod1 пытается изменить глобальную переменную var, определенную в mod2. Но var в mod2 и var в mod кажутся двумя разными вещами. Таким образом, результат показывает, что такая модификация не работает.

Вот код:

#code for mod2.py
global var  
var = 1 
def fun_of_mod2():
    print var

#code for mod1.py
from mod2 import var,fun_of_mod2    
global var #commenting out this line yields the same result
var = 2 #I want to modify the value of var defined in mod2
fun_of_mod2() #but it prints: 1 instead of 2. Modification failed :-(

Любой намек на то, почему это происходит? И как я могу изменить значение val, определенное в mod2, в mod1?

Спасибо


Ответы:


1

При импорте var в mod1:

from mod2 import var,fun_of_mod2

Вы даете ему имя var в пространстве имен mod1. Это как если бы вы сделали это:

import mod2
var = mod2.var
fun_of_mod2 = mod2.fun_of_mod2
del mod2

Другими словами, теперь у значения есть два имени: mod1.var и mod2.var. Сначала они одинаковы, но когда вы переназначаете mod1.var, mod2.var по-прежнему указывает на то же самое.

То, что вы хотите сделать, это просто:

import mod2

Затем получите доступ и назначьте переменную как mod2.var.

Важно отметить, что глобальные переменные в Python не являются действительно глобальными. Они являются глобальными только для модуля, в котором они объявлены. Чтобы получить доступ к глобальным переменным внутри другого модуля, вы используете синтаксис module.variable. Оператор global можно использовать внутри функции, чтобы позволить присвоить глобальное имя модуля (без этого присвоение переменной делает ее локальной переменной в этой функции). Это не имеет никакого другого эффекта.

03.06.2012
  • +1, но чтобы полностью ответить на вопрос, вы должны упомянуть, что делает global. Основная проблема ОП, похоже, заключается в непонимании того, где это полезно. 03.06.2012
  • Спасибо, я кажется понял. 03.06.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..