Java 2D хеш-таблицы для обучения Q

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

В вашем Например, есть только 3 области, где x будет искать в:

  • области спама - содержащем все, что определено в code3 и code5 (а также code4, ваша переменная цикла)
  • Глобальная область - содержащая все, что определено в коде1, а также Foo (и любые изменения после него)
  • Пространство имен builtins. Немного специального случая - это содержит различные встроенные функции и типы Python, такие как len () и str (). Как правило, это не должно изменяться никаким кодом пользователя, поэтому ожидайте, что он будет содержать стандартные функции и ничего больше.

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

def foo():
    x=4
    def bar():
        print x  # Accesses x from foo's scope
    bar()  # Prints 4
    x=5
    bar()  # Prints 5

Ограничения:

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

global_var1 = []
global_var2 = 1

def func():
    # This is OK: It's just accessing, not rebinding
    global_var1.append(4) 

    # This won't affect global_var2. Instead it creates a new variable
    global_var2 = 2 

    local1 = 4
    def embedded_func():
        # Again, this doen't affect func's local1 variable.  It creates a 
        # new local variable also called local1 instead.
        local1 = 5
        print local1

    embedded_func() # Prints 5
    print local1    # Prints 4

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

global_var = 4
def change_global():
    global global_var
    global_var = global_var + 1

В настоящее время нет способа сделать то же самое для переменных в приложении областей function , но Python 3 вводит новое ключевое слово «nonlocal», которое будет действуют аналогично глобальным, но для вложенных областей функций.

0
задан ILikeCode 21 March 2019 в 18:35
поделиться