Использование глобальных переменных в функции - PullRequest
2807 голосов
/ 08 января 2009

Как я могу создать или использовать глобальную переменную в функции?

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

Ответы [ 18 ]

20 голосов
/ 20 декабря 2014

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

следующим образом:

var = "test"

def printGlobalText():
    global var #wWe are telling to explicitly use the global version
    var = "global from printGlobalText fun."
    print "var from printGlobalText: " + var

def printLocalText():
    #We are NOT telling to explicitly use the global version, so we are creating a local variable
    var = "local version from printLocalText fun"
    print "var from printLocalText: " + var

printGlobalText()
printLocalText()
"""
Output Result:
var from printGlobalText: global from printGlobalText fun.
var from printLocalText: local version from printLocalText
[Finished in 0.1s]
"""
18 голосов
/ 09 января 2009

Вы на самом деле не храните глобал в локальной переменной, просто создаете локальную ссылку на тот же объект, на который ссылается ваша исходная глобальная ссылка. Помните, что почти все в Python является именем, относящимся к объекту, и ничто не копируется в обычной операции.

Если вам не нужно было явно указывать, когда идентификатор должен был ссылаться на предопределенную глобальную переменную, вам, вероятно, придется явно указывать, когда идентификатор является новой локальной переменной (например, с чем-то вроде команда var 'видна в JavaScript). Поскольку локальные переменные встречаются чаще, чем глобальные переменные в любой серьезной и нетривиальной системе, система Python в большинстве случаев имеет больше смысла.

Вы можете иметь язык, который пытался угадать, используя глобальную переменную, если она существует, или создавая локальную переменную, если она не существует. Однако это было бы очень подвержено ошибкам. Например, импорт другого модуля может непреднамеренно ввести глобальную переменную с таким именем, что приведет к изменению поведения вашей программы.

15 голосов
/ 04 февраля 2015

Попробуйте это:

def x1():
    global x
    x = 6

def x2():
    global x
    x = x+1
    print x

x = 5
x1()
x2()  # output --> 7
12 голосов
/ 07 апреля 2017

Если у вас есть локальная переменная с тем же именем, вы можете использовать функцию globals() .

globals()['your_global_var'] = 42
12 голосов
/ 24 октября 2015

После этого и в качестве дополнения используйте файл, содержащий все глобальные переменные, объявленные локально, а затем import as:

Файл initval.py :

Stocksin = 300
Prices = []

Файл getstocks.py :

import initval as iv

def getmystocks(): 
    iv.Stocksin = getstockcount()


def getmycharts():
    for ic in range(iv.Stocksin):
11 голосов
/ 07 января 2016

Запись в явные элементы глобального массива, по-видимому, не нуждается в глобальном объявлении, хотя для записи в него «оптовый» действительно необходимо следующее:

import numpy as np

hostValue = 3.14159
hostArray = np.array([2., 3.])
hostMatrix = np.array([[1.0, 0.0],[ 0.0, 1.0]])

def func1():
    global hostValue    # mandatory, else local.
    hostValue = 2.0

def func2():
    global hostValue    # mandatory, else UnboundLocalError.
    hostValue += 1.0

def func3():
    global hostArray    # mandatory, else local.
    hostArray = np.array([14., 15.])

def func4():            # no need for globals
    hostArray[0] = 123.4

def func5():            # no need for globals
    hostArray[1] += 1.0

def func6():            # no need for globals
    hostMatrix[1][1] = 12.

def func7():            # no need for globals
    hostMatrix[0][0] += 0.33

func1()
print "After func1(), hostValue = ", hostValue
func2()
print "After func2(), hostValue = ", hostValue
func3()
print "After func3(), hostArray = ", hostArray
func4()
print "After func4(), hostArray = ", hostArray
func5()
print "After func5(), hostArray = ", hostArray
func6()
print "After func6(), hostMatrix = \n", hostMatrix
func7()
print "After func7(), hostMatrix = \n", hostMatrix
5 голосов
/ 05 сентября 2017

Я добавляю это, поскольку я не видел это ни в одном из других ответов, и это могло бы быть полезным для кого-то, борющегося с чем-то подобным. Функция globals() возвращает изменяемый словарь глобальных символов, в котором вы можете «волшебным образом» сделать данные доступными для остальной части вашего кода. Например:

from pickle import load
def loaditem(name):
    with open(r"C:\pickle\file\location"+"\{}.dat".format(name), "rb") as openfile:
        globals()[name] = load(openfile)
    return True

и

from pickle import dump
def dumpfile(name):
    with open(name+".dat", "wb") as outfile:
        dump(globals()[name], outfile)
    return True

Просто позволит вам выгружать / загружать переменные из глобального пространства имен и в него. Супер удобно, без суеты, без суеты. Я уверен, что это только Python 3.

5 голосов
/ 19 августа 2017

Ссылка на пространство имен класса, в котором вы хотите увидеть изменение.

В этом примере бегун использует max из файла конфигурации. Я хочу, чтобы мой тест изменил значение max , когда бегун его использует.

основной / config.py

max = 15000

главная / runner.py

from main import config
def check_threads():
    return max < thread_count 

Тесты / runner_test.py

from main import runner                # <----- 1. add file
from main.runner import check_threads
class RunnerTest(unittest):
   def test_threads(self):
       runner.max = 0                  # <----- 2. set global 
       check_threads()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...