2016-09-16 74 views
0

我做了一个函数,在一个numpy的纬度/经度值数组上运行。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时,即使该函数没有为纬度/经度返回新数组,我的纬度/经度数组也会改变。

例如呼叫REGRID前:

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

调用REGRID AFTER:

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

我不记得以前有类似的问题。特别奇怪的是,我昨晚没有任何问题地运行相同的脚本,但今天早上该函数正在重新定义我的经纬度变量。我重新启动了我的IDE,但我无法确定为什么会发生这种情况。

这就是说,如果我把经纬度复制到regrid然后我没有问题。例如

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

我想确定行为的突然变化。我现在通常在熊猫工作,而不是那么忙碌,所以也许行为没有改变,而我只是注意到了这一点。

的Python 2.7,numpy的1.10.4

+0

您的代码看起来不正确df = pd.DataFrame() return df'与您的工作代码相同吗? – EdChum

+5

您正将一个可变值传递给一个函数,然后对其进行变异。 Numpy数组一直以这种方式变化。 – 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