Модуль Python видит полный список как пустой в другом модуле - PullRequest
0 голосов
/ 13 апреля 2010

Я работаю над проектом Pygame и выложил основной движок. Проблема в том, что я столкнулся с ошибкой, которую просто не могу понять. Происходит следующее: один модуль не может прочитать переменную из другого модуля.

Дело не в том, что переменная не может быть прочитана, она просто видит пустой список вместо того, что есть на самом деле.

Вместо того, чтобы публиковать весь исходный код, я воспроизвел ошибку в двух небольших отрывках, которые, надеюсь, сможет понять умелый питонист в своей голове.

Код:

main.py (это файл, который запускается) экран импорта

screens = [] #A stack for all the game screens

def current_screen():
    #return a reference to the current screen
    return screens[-1]

def play():
    print'play called'
    current_screen().update()

if __name__=='__main__':
    screens.append(screen.Screen())
    play()

screen.py

import main

class Screen:
    def __init__(self):
        print'screen made'
    def update(self):
        print main.screens
        #Should have a reference to itself in there

Спасибо!

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Не импортируйте основной скрипт. При непосредственном запуске файла main.py он становится модулем __main__. Когда вы затем импортируете main, он найдет тот же файл (main.py), но загрузит его второй раз , под другим объектом модуля (main вместо __main__.)

Решение - не делать этого. Не помещайте вещи, которые вы хотите «экспортировать» в другие модули, в основной скрипт. Это не будет работать правильно. Поместите их в третий модуль. Или передайте их в качестве аргументов вызываемым функциям и классам.

0 голосов
/ 13 апреля 2010

Весь смысл if __name__=='__main__': в том, чтобы препятствовать выполнению кода при импорте модуля. Поэтому, когда вы импортируете main из screen, эта часть не запускается, и список остается пустым, и play() также никогда не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...