2017-01-08 3 views
-1
myList = [5, 2] 
def foo(): 
    myList[0] = 6 

В приведенном выше примере myList по-прежнему мутирован, хотя он не является глобальным и не передается параметром. Однако это не работает, если переменная не является списком.Почему функция python способна мутировать неглобальный список?

+0

Я подумал, что если вы хотите что-то мутировать в функции вы должны вызвать: глобальный MyList? –

+0

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

+0

Не когда мутирующие элементы списка list [0] = 4' будут работать, а 'list = [4, 5]' не будут. –

ответ

2

правил видимости примерно так:

  • Локальный объем: вы определяете переменную внутри функции
  • вшита объем: Ваша функция находится внутри другой функции (или несколько слоев функциев), и один из выше (ограждающих) функций объявлена ​​переменная
  • глобальный охват: глобальный масштаб (модуль или файл)
  • Встроенный: Любые встроенные значения родной для Python

Это известно как правило LEGB.

В вашем случае это потому, что вы не назначаете значение для имени myList внутри foo(). Вы назначаете только значение индекса 0 существующего списка. Поэтому глобальное значение myList - это область действия, которую вы используете.

2

myList - глобальная переменная. Он существует в контексте foo, где вы получаете доступ и изменяете один из его элементов.

myList = [0, 5] 

def foo(): 
    myList[0] = 6 

print('Before foo: {}'.format(myList)) 
foo() 
print('After foo: {}'.format(myList)) 

Выход

Before foo: [0, 5] 
After foo: [6, 5] 

Это не работает, однако, если переменная не является списком.

Я предполагаю, что вы пытались что-то похожее на следующее:

a = 0 

def bar(): 
    a = 6 

print('Before bar: {}'.format(a)) 
bar() 
print('After bar: {}'.format(a)) 

Выходной

Before bar: 0 
After bar: 0 

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

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

b = 0 

def baz(): 
    global b 
    b = 6 

print('Before baz: {}'.format(b)) 
baz() 
print('After baz: {}'.format(b)) 

Выход

Before baz: 0 
After baz: 6 
+0

Пример ключевого слова «global» может быть полезен здесь, поскольку он показывает, как один _can_ присваивает глобальную переменную из локальной области. Python просто предполагает, что вы обычно не подразумеваете это (и не имеет синтаксиса для явного объявления переменной) – pvg

+0

@pvg Шаг впереди вас. :) – Tagc

Смежные вопросы