2016-09-16 2 views
0

Я создал функцию, которая работает с множеством значений широты/долготы.Функция Python переопределяет переменные, которые не передаются

from __future__ import division, print_function 

import pandas as pd, numpy as np 


def regrid2(lats, lons, lat_res=0.25, lon_res=0.25): 

    # round lat/lon values to nearest decimal degree according to specified 
    # resolution and reshape the array 
    lats[lats<=0] = lat_res*(np.round(lats[lats<=0]/lat_res)) - lat_res/2 
    lats[lats>0] = lat_res*(np.round(lats[lats>0]/lat_res)) + lat_res/2 

    lons[lons<=0] = lon_res*(np.round(lons[lons<=0]/lon_res)) + lon_res/2 
    lons[lons>0] = lon_res*(np.round(lons[lons>0]/lon_res)) - lon_res/2 

    lats = np.reshape(lats, (lats.size,1), order='F') 
    lons = np.reshape(lons, (lons.size,1), order='F') 

    lats = 0 

    df = pd.DataFrame() 
    return df 


lat = np.arange(80.111, 90, 5) 
lon = np.arange(170.11, 180,0.33) 

df = regrid2(lat,lon) 

Когда я называю regrid2 мой Lat/Lon массивы изменить, даже если функция не возвращает новые массивы для широты/долготы.

Е.Г., перед вызовом regrid:

>>> lat.min() 
    80.111000000000004 
>>> lon.min() 
    170.11000000000001 

после вызова regrid:

>>> lat.min() 
    80.125 
>>> lon.min() 
    169.875 

Я не помню, чтобы подобные проблемы раньше. Что особенно странно, так это то, что я запускал один и тот же сценарий прошлой ночью без проблем, но сегодня утром функция переопределяет мои переменные lat/lon. Я снова начал работу с IDE, но я не смог определить, почему это происходит.

Это, если говорить, если я скопирую lat/lon в regrid, то у меня нет проблем. например

df = regrid2(lat.copy(),lon.copy()) 
>>> lat.min() 
    80.111000000000004 
>>> lon.min() 
    170.11000000000001 

Я хотел бы определить внезапное изменение поведения. Я обычно работаю в Pandas в эти дни, не так много с numpy, так что, возможно, не было изменений в поведении, скорее я просто замечаю это.

Python 2.7, Numpy 1.10.4

+0

ваш код выглядит некорректно 'df = pd.DataFrame() return df' совпадает с вашим рабочим кодом? – EdChum

+5

Вы передаете изменяемое значение функции и затем ее мутируете. Таким образом, массивы с множественными числами всегда изменялись. – kojiro

+2

Ваше название вводит в заблуждение, переменные 'lat' и' lon' определенно пройдены. – IanS

ответ

1

можно передать изменяемые данные функции, то мутирует его.

Вы можете использовать

def regrid2(lats, lons, lat_res=0.25, lon_res=0.25): 
    lats, lons = np.copy(lats), np.copy(lons) 

работать с копиями вместо?

+0

Это то, что я подозревал. Спасибо за разъяснения. Я всегда думал о функциях, автоматически создающих копии и никогда не затрагивающих ссылочные переменные. Хотя это может быть нормально, я должен признать, что это по-прежнему звучит как необычное поведение. – tnknepp