Ниже приведен фрагмент кода,
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
Потому что вы вызываете
countDivisors()
при объявлении класса.Отвечает ли это на ваш вопрос? Порядок выполнения и стиль кодирования в Python
Учитывая, что единственной целью
countDivisors()
является инициализация глобальной переменной (sieve
), ее вызов вообще не принадлежит внутри классаSolution
— ни в теле класса, ни в__init__()
метод. Вызов функции должен быть на верхнем уровне вашего кода, возможно, сразу после определения функции.