у меня есть проблема понимания того, что происходит с результатом следующих фрагментов кода:класс Python и глобальные против локальных переменных
my_str = "outside func"
def func():
my_str = "inside func"
class C():
print(my_str)
print((lambda:my_str)())
my_str = "inside C"
print(my_str)
Выход:
outside func
inside func
inside C
Другой кусок кода является:
my_str = "not in class"
class C:
my_str = "in the class"
print([my_str for i in (1,2)])
print(list(my_str for i in (1,2)))
выход:
[‘in the class’, 'in the class’]
['not in class’, 'not in class’]
Возникает вопрос:
- Что происходит здесь, в каждой печати() заявление?
- Может ли кто-нибудь объяснить почему оператор print() получает строку из разных пространств имен?
Edit 1:
Я думаю, что это отличается от this question, потому что я смиренно думаю ответы там не объясняют этот вариант:
my_str = "outside func"
def func():
my_str = "inside func"
class C():
print(my_str)
print((lambda:my_str)())
#my_str = "inside C"
print(my_str)
Выход есть:
inside func
inside func
inside func
Редактировать 2:
В самом деле, это дубликат из this question, потому что, как говорит Мартин Питерс:
Ответ там говорится: Если имя назначается в пределах тела класса, почти в самом начале. Вы назначили my_str, сделав тот же случай , как и там. Комментируя эту строку означает, что вы больше не назначаете my_str, что делает его тем же случаем, что и x.
@MartijnPieters Прекрасный ответ Антти там охватывает первый случай. Второй случай доходит до этого, но все же это не точный обман. Возможно, я оставлю эту ссылку для будущих посетителей на этот вопрос. (Вы уже подготовили проект обряда;)) –
@BhargavRao: извините, я предположил, что вы ссылались на [Краткое описание правил определения Python] (http://stackoverflow.com/q/291978)! Это действительно обман. –