почему глобальное ключевое слово не нужно с объектом - PullRequest
0 голосов
/ 20 ноября 2018

в этом примере мне нужно включить глобальное ключевое слово.Я читал в другом месте по обмену стека, что неизменяемым объектам нужно глобальное ключевое слово.

def foo(param):
    global message
    message += param

message = " hello "

foo("world")

print(message)

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

def foo(param):
    global message
    message += [ param ]

message = [ "hello" ]

foo("world")

print(message)

но в этом примере я создаю объект «контейнер», который позволяет мне заранее перейти к глобальному ключевому слову.

class container:

    def __init__(self):
        self._message = ""

    def __str__(self):
        return self._message

    def add(self, param):
        self._message += param

def foo(param):
    message.add(param)

message = container()
message.add(" hello ")

foo("world")

print(message)

Каковы правила использования глобального ключевого слова?Это кажется противоречивым

1 Ответ

0 голосов
/ 20 ноября 2018

Этот часто задаваемый вопрос имеет ответ в официальной документации:

В Python переменные, на которые ссылаются только внутри функции, неявно глобальны.Если переменной присваивается значение где-либо в теле функции, она считается локальной, если только она явно не объявлена ​​как глобальная.

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

См. Также документацию по global для получения более подробной информации.

...