Да, перечислите «утечку» их переменных в Python 2.x, как и для циклов.
В ретроспективе это было признано ошибкой, и ее избегали с помощью выражений генератора. EDIT: как Мэтт Б. отмечает , его также избегали, когда синтаксисы синтаксиса и синтаксиса слова были переданы из Python 3.
Поведение списков List должно было быть оставлено, как и в Python 2, но он полностью исправлен в Python 3.
Это означает, что во всех:
list(x for x in a if x>32)
set(x//4 for x in a if x>32) # just another generator exp.
dict((x, x//16) for x in a if x>32) # yet another generator exp.
{x//4 for x in a if x>32} # 2.7+ syntax
{x: x//16 for x in a if x>32} # 2.7+ syntax
x
всегда является локальным для выражения, а они:
[x for x in a if x>32]
set([x//4 for x in a if x>32]) # just another list comp.
dict([(x, x//16) for x in a if x>32]) # yet another list comp.
в Python 2.x все протекают переменную x
в окружающую область.
UPDATE для Python 3.8 (?): PEP 572 ] представит оператор присваивания :=
, который намеренно просачивается из понятий и выражений генератора! Это мотивировано, по существу, двумя вариантами использования: захват «свидетеля» из функций раннего завершения, таких как any()
и all()
:
if any((comment := line).startswith('#') for line in lines):
print("First comment:", comment)
else:
print("There are no comments")
и обновление изменчивого состояния:
total = 0
partial_sums = [total := total + v for v in values]
Для точного определения области обзора см. Приложение B . Переменная назначается в ближайшем окружении def
или lambda
, если только эта функция не объявит ее nonlocal
или global
.
Для копирования с помощью индексов и триггеров выполните эти 2 запроса:
CREATE TABLE newtable LIKE oldtable;
INSERT INTO newtable SELECT * FROM oldtable;
Чтобы скопировать только структуру и данные, используйте этот:
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Я уже спрашивал об этом раньше: