Прекарах векове в експерименти и имам теория защо получавате тази грешка. Не съм сигурен, но това обяснява защо работи за c
, а не за d
. Надявам се това да ви помогне, коментирайте, ако не сте съгласни :)
def Tuple(this):
print(a) # this always works
try:
print(b) # this always gives an error
except NameError:
print("...b is not defined")
try:
return tuple(this) # this only gives an error for d and e
except NameError:
print("...couldn't make it a tuple")
a = (1,2)
class Foo(object):
b = (3,4)
c = Tuple((i,j) for j in b for i in a)
d = Tuple((i,j) for i in a for j in b)
e = Tuple((i,j,k) for i in a for j in b for k in (5, 6))
f = Tuple((i,j,k) for j in b for i in (5, 6) for k in a)
print("\nc:", c,"\nd:", d,"\ne:", e,"\nf:", f)
Какво се случи: всеки път, когато извиках функцията Tuple()
, b
не беше дефинирана, но a
винаги беше дефинирана. Това обяснява защо получавате грешка за d
и e
, но не обяснява защо c
и f
работят, въпреки че b
е „недефинирано“
Моята теория: Първият for
цикъл се изчислява, преди всичко да бъде преобразувано в кортеж. Например, ако се опитате да направите това: Tuple((a, b, c) for a in loop1, for b in loop2 for c in loop3)
, в класа Foo първо ще изчисли for a in loop1
, след това ще се премести в foo и ще изчисли циклите 2 и 3.
Накратко:
- прави първо for цикъл
- преминава към кортежна функция
- прави останалите цикли
- грешката възниква, ако променлива във 2-ри или 3-ти цикъл е в клас Foo
person
Tom Fuller
schedule
02.09.2016
b
повтори в най-външнияfor
израз, който се оценява незабавно - вижте напр. python.org/dev/peps/pep -0289/#early-binding-versus-late-binding за обосновката. По същия начин, ако промените примера в документите наb = list(i for i in range(a))
, той работи добре, аd = tuple((i,j) for i, j in itertools.product(b, a))
ще работи и в двата случая. - person jonrsharpe   schedule 29.10.2015