Какова последовательность выполнения кода в python

avatar
Rajat Mishra
8 августа 2021 в 17:32
68
1
-2

Ниже приведен фрагмент кода,

sieve=[0]*(1000001)
def countDivisors():
    global sieve
    print("@2")
    for i in range(1,1000001):
        j=i
        while(j<1000001):
            sieve[j]+=1
            j+=i
class Solution:
    # @param A : list of integers
    # @return a list of integers
    countDivisors()
    def solve(self, A):
        n=len(A)
        ans=[]
        global sieve
        for i in range(n):
            ans.append(sieve[A[i]])
        return ans
                
print("main")          
s=Solution()
print("s declared")
A = [[3, 5, 4, 2],[8, 5, 6, 2]]
for i in A:
    print(s.solve(i))

Вывод:

@2
main
s declared
[2, 2, 3, 2]
[4, 2, 4, 2]

Почему "@2" перед "main" печатается первым. Какова последовательность выполнения кода и почему? Чем он отличается от приведенного ниже кода? В приведенном ниже фрагменте кода 'countDivisor()' вызывается в 'init()'.

sieve=[0]*(1000001)
def countDivisors():
    global sieve
    print("@2")
    for i in range(1,1000001):
        j=i
        while(j<1000001):
            sieve[j]+=1
            j+=i
class Solution:
    # @param A : list of integers
    # @return a list of integers
    def __init__(self):
        countDivisors()
    def solve(self, A):
        n=len(A)
        ans=[]
        global sieve
        for i in range(n):
            ans.append(sieve[A[i]])
        return ans
Источник
deceze
8 августа 2021 в 17:37
4

Потому что вы вызываете countDivisors() при объявлении класса.

Mohamed Raza
8 августа 2021 в 17:41
1

Отвечает ли это на ваш вопрос? Порядок выполнения и стиль кодирования в Python

jasonharper
8 августа 2021 в 17:51
1

Учитывая, что единственной целью countDivisors() является инициализация глобальной переменной (sieve), ее вызов вообще не принадлежит внутри класса Solution — ни в теле класса, ни в __init__() метод. Вызов функции должен быть на верхнем уровне вашего кода, возможно, сразу после определения функции.

Ответы (1)

avatar
chepner
8 августа 2021 в 17:53
1

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

countDivisors()


def solve(self, A):
    n=len(A)
    ans=[]
    global sieve
    for i in range(n):
        ans.append(sieve[A[i]])
    return ans


Solution = type('Solution', (), {'solve': solve})