PYTHON_JOB_INTERVIEW Telegram 1123
🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»

🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается

📍 Ситуация:

У тебя есть простой код, который должен собирать данные в список из файла:


results = []

def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())

# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")

print(f"Total errors: {len(results)}")


Но после запуска ты получаешь:

Total errors: 0


🙃 Хотя ты уверен, что в обоих файлах есть строки с "error".

🧩 Задача:

1. Почему список results остаётся пустым?
2. Почему нет ошибки при обращении к results.append(...)?
3. Что будет, если вместо append() просто написать results = [...] внутри функции?
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?

🛠 Решение:

🔸 Проблема в области видимости переменных:
Функция использует results, определённый вне функции, но не объявляет его как global.
Однако results.append(...) — это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.

Если бы внутри функции была строка results = [...], Python бы создал локальную переменную results, и тогда append бы вызывал UnboundLocalError.

🔸 Для ясности и чистоты кода лучше делать так:


def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())

results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)


Или, если обязательно нужно использовать глобальную переменную:


results = []

def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())


🔸 Проверка:

- print(locals()) — покажет локальные переменные
- print(globals()) — покажет глобальные

📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без global, но присваивание новой переменной требует явного global. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.
7👍3👎1



tgoop.com/python_job_interview/1123
Create:
Last Update:

🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»

🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается

📍 Ситуация:

У тебя есть простой код, который должен собирать данные в список из файла:


results = []

def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())

# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")

print(f"Total errors: {len(results)}")


Но после запуска ты получаешь:

Total errors: 0


🙃 Хотя ты уверен, что в обоих файлах есть строки с "error".

🧩 Задача:

1. Почему список results остаётся пустым?
2. Почему нет ошибки при обращении к results.append(...)?
3. Что будет, если вместо append() просто написать results = [...] внутри функции?
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?

🛠 Решение:

🔸 Проблема в области видимости переменных:
Функция использует results, определённый вне функции, но не объявляет его как global.
Однако results.append(...) — это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.

Если бы внутри функции была строка results = [...], Python бы создал локальную переменную results, и тогда append бы вызывал UnboundLocalError.

🔸 Для ясности и чистоты кода лучше делать так:


def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())

results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)


Или, если обязательно нужно использовать глобальную переменную:


results = []

def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())


🔸 Проверка:

- print(locals()) — покажет локальные переменные
- print(globals()) — покажет глобальные

📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без global, но присваивание новой переменной требует явного global. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.

BY Python вопросы с собеседований


Share with your friend now:
tgoop.com/python_job_interview/1123

View MORE
Open in Telegram


Telegram News

Date: |

Telegram Channels requirements & features In the “Bear Market Screaming Therapy Group” on Telegram, members are only allowed to post voice notes of themselves screaming. Anything else will result in an instant ban from the group, which currently has about 75 members. Polls Each account can create up to 10 public channels The group also hosted discussions on committing arson, Judge Hui said, including setting roadblocks on fire, hurling petrol bombs at police stations and teaching people to make such weapons. The conversation linked to arson went on for two to three months, Hui said.
from us


Telegram Python вопросы с собеседований
FROM American