2016-09-16 53 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