Переменная python import-ed сохраняет то же значение, хотя и меняется - PullRequest
3 голосов
/ 06 февраля 2012

У меня есть следующий код Python, который, на мой взгляд, ведет себя странно:

Импортированный модуль:

# ChangeVar.py
def Print1():
    print "1--"

def Print2():
    print "2--"

Print=Print1

def Change():
    global Print
    Print=Print2

Основной модуль:

#UseVar.py
from ChangeVar import *

Print()
Print()

Change()


Print()
Print()

Я ожидаю этот коднапечатать следующее:

1--
1--
2--
2--

Но вместо этого я получаю:

1--
1--
1--
1--

Может кто-нибудь указать мне на правую часть ссылки на Python или объяснить, почему я не получаюожидаемое поведение?

Спасибо,

Юлиан

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Когда вы делаете from ChangeVar import *, вы создаете имя Print в своем основном модуле, ссылаясь на то, что Print в настоящее время установлено как в ChangeVar.Но это отдельное имя, указывающее на одну и ту же функцию, поэтому вызов Change не обновляет ее в вашем главном модуле.

Существует два способа обойти это:

  • Вы можетесделать import ChangeVar и затем позвонить ChangeVar.Print().Поскольку это имя используется в ChangeVar, на него влияет ChangeVar.Change(), как говорит @Lattyware.
  • Вы можете создать функцию Print, которая вызывает Print1 или Print2, в зависимости от какой-либо другой переменнойустановлен на.
2 голосов
/ 06 февраля 2012

Python's global является глобальным только для модуля.

import ChangeVar

ChangeVar.Print()
ChangeVar.Print()

ChangeVar.Change()

ChangeVar.Print()
ChangeVar.Print()

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

# ChangeVar.py
class ChangeVar(object):
    def __init__(self):
        self.Print=self.Print1

    def Print1(self):
        print "1--"

    def Print2(self):
        print "2--"

    def Change(self):
        self.Print=self.Print2

Используется так:

#UseVar.py
from ChangeVar import ChangeVar

cv = ChangeVar()
cv.Print()
cv.Print()

cv.Change()

cv.Print()
cv.Print()

Я также хотел бы отметить, что согласно Руководству по стилю Python lowercase_with_underscores является предпочтительным стилем именования для функций, а lowercase для имен модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...