1. Python / Говнокод #7544

    −99

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    # разбираюсь с питоном, может растолкуете почему так
    >>> z = [lambda: i for i in [1,2,3]]
    # почему вот такой результат?
    >>> z[0](), z[1](), z[2]()
    (3, 3, 3) 
    
    # каждый элемент списка - отдельная функция
    >>> z[0] == z[1], z[0] is z[1]
    (False, False)
    
    # вот таким образом выходит правильно.
    >>> z = [lambda: 1, lambda: 2, lambda:3]
    >>> z[0](), z[1](), z[2]()
    (1, 2, 3)

    Автор - я. Меня действительно интересует, почему так происходит.

    Запостил: Fai, 14 Августа 2011

    Комментарии (14) RSS

    • показать все, что скрытоНеужели тут все такие тупые? Только комментировать умеете?
      Ответить
      • Fail
        Ответить
        • Да не троллю я, я действительно не знаю почему так происходит и как нужно делать.
          Ответить
      • твои 3 лямбды возвращает i, которые в конце цикла = 3.

        а во втором случае 3 отдельных лямбды и каждая возвращает своё
        Ответить
        • И как сделать так чтобы было не 3 разных лямбды возвращающих i, а 3 возвращающих 1,2,3?
          Ответить
    • z = [lambda j=i: j for i in [1,2,3]]
      Ответить
      • Спасибо
        Ответить
        • Это может оказаться грязным хаком. Вроде был ещё способ, но я его сейчас уже не вспомню.
          Ответить
          • Странно что нет другого способа создать лямбда функцию, которая затем не будет зависеть от переменной.
            Ответить
    • такое впечатление, что говнокод - последнее прибежище
      Ответить
    • Ты перепутал со StackOverflow или AscDev накрайняк.
      Ответить
    • так:
      z = [lambda i=i:i for i in [1,2,3]]

      или так:
      z = map(lambda i: lambda: i, [1,2,3])
      Ответить

    Добавить комментарий