2016-04-19 5 views
2

Я хочу сгенерировать список базового монома от x^0 до x^n (в частности, n = 9) с помощью Sympy. Мое быстрое решение простой список понимание в сочетании с синтаксисом функции лямбда Пайтона:Sympy и лямбда-функции

import sympy as sym 
x = sym.symbols('x') 

monomials = [lambda x: x**n for n in range(10)] 

Однако, когда я проверить, что monomials строится, как и ожидалось, я считаю, что:

print([f(x) for f in monomials]) 
>>> [x**9, x**9, x**9, x**9, x**9, x**9, x**9, x**9, x**9, x**9] 

Если я переопределить monomials без используя синтаксис лямбда, я получаю то, что в противном случае ожидал бы:

monomials = [x**n for n in range(10)] 
print(monomials) 
>>> [1, x, x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9] 

Почему у меня такое поведение?


функции:

  • Python 3.5.1
  • SymPy 1,0

Я использую менеджер пакетов Anaconda 2.5.0 (64-бит).

ответ

0

Вы должны использовать второй ARG со значением

monomials = [lambda x, n=n: x**n for n in range(10)] 

по умолчанию в противном случае у вас есть замыкание и получить не стоимость, а ссылки на n.

Смежные вопросы