• Почему так происходит?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Лутц - "Изучаем Python", глава 20, страница 596
    Как известно, имена, которым выполняется присваивание внутри функции, по умолчанию рассматриваются как локальные – они располагаются в области видимости функции и существуют только во время работы функции. Но я еще не говорил, что локальные переменные определяются статически, во время компиляции программного кода в инструкции def, а не в соответствии с операциями присваивания, производимыми во время выполнения. Эта особенность становится причиной появления самых причудливых сообщений в группе новостей, получаемых от начинающих программистов.
    Обычно, если внутри функции имени не присваивается какое-либо значение, поиск его будет производиться в области видимости объемлющего модуля. Но посмотрите, что произойдет, если добавить инструкцию присваивания переменной X после ее использования.
    X = 99
    >>> def selector():
    ... print(X) # Переменная еще не существует!
    ... X = 88 # X классифицируется как локальная переменная
    ... # То же самое происходит при “import X”, “def X”...
    >>> selector()
    Traceback (most recent call last):
    ...текст сообщения об ошибке опущен...
    UnboundLocalError: local variable ‘X’ referenced before assignment

    Было получено сообщение о том, что переменная не определена, но причина его появления не очевидна. Этот программный код компилируется интерпретатором во время ввода в интерактивной оболочке или во время импорта модуля. Вовремя компиляции Python обнаруживает операцию присваивания переменной X и делает вывод, что X – это локальное имя везде в теле функции. Но во время выполнения функции, из-за того, что к моменту вызова инструкции print операция присваивания еще не производилась, интерпретатор сообщает о том, что имя не определено. Согласно этому правилу использования имен, он говорит, что обращение к локальной переменной X произведено до того, как ей было присвоено значение. Фактически любая операция присваивания внутри функции создает локальное имя. Операция импортирования, =, вложенные инструкции def, вложенные определения классов и так далее – все трактуются именно таким образом. Проблема возникает из-за того, что операция присваивания делает имена локальными для всей функции, а не только для той ее части, которая следует заинструкцией присваивания.

    Читать учебники - полезно.
    Ответ написан
    5 комментариев
  • Python два массива. Как вывести уникальные значения?

    @trofimovdev
    Python
    Можно использовать множества:
    a = [1, 2, 3]
    b = [2, 3, 4]
    print(set(a + b))
    >>> {1, 2, 3, 4}
    Ответ написан
    2 комментария
  • Как правильно использовать список с if?

    CrazzyDi
    @CrazzyDi
    Например, так:
    while True:
        l = ["Российской федерации", "Россия", "Российской федерации"]
        d = { "Russia" : "146 млн"}
        answer = input("Население какой страны Вас интересует? :  ")
        if answer in l:
            print(d["Russia"])
        else:
            print("Не работает")
    Ответ написан
    2 комментария
  • Как изменить сайт когда человек заходит на него с телефона?

    drugoi
    @drugoi
    Front-end Developer
    Проверка ширины экрана — не самая лучшая проверка, лучше по User-Agent:
    if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
     // ваш код для мобильных устройств
    }

    Если же вы всё таки хотите через ширину экрана, то лучше так:
    if (window.innerWidth <= 800) {
     // ваш код
    }
    Ответ написан
    3 комментария
  • Расположить 2 div внутри третьего на одном уровне?

    @DenJel
    <div class="clearfix">
        <div class="left">
            <div class="center"></div>
        </div>
        <div class="right"></div>
    </div>

    .left{
      float:left;
      width: 80%;
    }
    .right{
      float: right
      width: 20%;
    }
    .center{
      width: свое
      margin: 0 auto;
    }

    Так же погуглите, что такое clearfix, долго объяснять
    Ответ написан
    1 комментарий