def f(x):
x=x/5.
return x
def g(x):
x/=5.
return x
x_var = np.arange(5,dtype=np.double)
f(x_var)
print x_var
g(x_var)
print x_var
Output:
[ 0. 1. 2. 3. 4.]
[ 0. 0.2 0.4 0.6 0.8]
Это поведение немного странно для меня, я всегда думал, что x/= 5. был эквивалентен x = x/5. , Но, очевидно, функция g (x) не создает новую ссылку с/= операцией. Может ли кто-нибудь предложить объяснение этому?Неожиданное поведение при самоопределении numpy
Спасибо за объяснение, я не смог найти документацию, которая заставила бы меня ожидать такого поведения. – bluecat
Это не проблема с numpy, это объекты-объекты, проходящие по ссылке. Реализация по умолчанию для всех '__i * __' заключается в том, чтобы выполнить операцию на месте, если это возможно, прочитайте [docs] (http://docs.python.org/reference/datamodel.html#object.__iadd__). У вас будет такая же проблема, передавая список Python в функцию, которая использовала 'def f (a): a * = 3; return a', он изменит исходный объект, с которым вы его вызвали, а не просто возвращает измененную копию. – Jaime
Спасибо, это была ссылка на документацию, которую я искал. Поэтому, если это возможно, он должен выполнять операцию на месте. Если __i * __ недоступен, он по умолчанию выполнит обычную операцию __ * __. – bluecat