なぜダブルはグローバル名と見なされますか?

以下のコードを作成しました。モジュールをインポートして実行しようとすると、次のエラーが表示されます。

>>> import aiyoo
>>> aiyoo.bixidist(1,3)
Traceback (most recent call last):
  File "", line 1, in 
  File "aiyoo.py", line 50, in bixidist
    currentDist = dist(X,Y,c)
  File "aiyoo.py", line 39, in dist
    distance = math.sqrt(math.pow((X-getLat(i)),2)+math.pow((Y-getLong(i)),2))
  File "aiyoo.py", line 28, in getLat
    xmlLat = double(xmlLat)
NameError: global name 'double' is not defined

二重関数は、XMLからのUnicode出力を関数の入力として二重に変換するために使用されました。だから私はなぜそれがaiyooモジュールがインポートされるときに名前であると考えられるのか分からない。

ここにaiyoo.pyという名前のモジュールがあります:

import math
import urllib2
from xml.dom.minidom import parseString
file = urllib2.urlopen('http://profil.bixi.ca/data/bikeStations.xml')
data = file.read()
file.close()
dom = parseString(data)

#this is how you get the data
def getID(i):
    xmlID = dom.getElementsByTagName('id')[i].toxml()
    xmlID = xmlID.replace('','').replace('','')
    xmlID = int(xmlID)
    return xmlID

def getLat(i):
    xmlLat = dom.getElementsByTagName('lat')[i].toxml()
    xmlLat = xmlLat.replace('','').replace('','')
    xmlLat = double(xmlLat)
    return xmlLat

def getLong(i):
    xmlLong = dom.getElementsByTagName('long')[i].toxml()
    xmlLong = xmlLong.replace('','').replace('','')    
    xmlLong = double(xmlLong)
    return xmlLong

#this is how we find the distance for a given station
def dist(X,Y,i):
    distance = math.sqrt(math.pow((X-getLat(i)),2)+math.pow((Y-getLong(i)),2))
    return distance

#this is how we find the closest station
def bixidist(X,Y):
     #counter for the lowest
    lowDist = 100000
    lowIndex = 0
    c = 0
    end = len(dom.getElementsByTagName('name'))
    for c in range(0,end):
            currentDist = dist(X,Y,c)
            if currentDist < lowDist:
                lowIndex = c
                lowDist = currentDist
    return getID(lowIndex)
1

4 答え

他の人が答えたように、 double はPythonの組み込み型ではありません。代わりに、 float を使用する必要があります。浮動小数点はC言語のdoubleを使用して実装されています[ ref ]をクリックします。

そしてあなたの質問の主要な部分、つまり "なぜdoubleがグローバルな名前とみなされたのか"については、 double と言う変数名ローカルコンテキストでは、次のルックアップはグローバルコンテキスト内にあります。グローバルコンテキストでも見つからない場合は、 NameError:グローバル名 'double'が定義されていないという例外が発生します。

ハッピーコーディング。

3
追加された

Pythonでは double 型はありません。エラーを見ると、 double という名前のものが見つからないという不満があります。 Pythonの浮動小数点型の名前は float です。

1
追加された

it should be xmlLat = float(xmlLat)

Python float は他の言語の double と同じです。 (64ビット)

http://codepad.org/AayFYhEd

0
追加された

これまでの2つの答えと同様、Pythonには double 型の変数がありません。代わりに float があります。

今あなたのタイトルの質問とおそらくあなたのための混乱の別の源です。インタプリタが "NameError:グローバル名 'double'が定義されていない」という理由は、Pythonが関数、変数、オブジェクトなどの名前を検索するためです。このパターンはPythonの名前空間とスコープの規則で記述されます。 SomeObject.Double(x))のように、存在しない関数 Double を関数内から呼び出そうとしたため、Pythonはまずその名前のオブジェクトを探しますローカルネームスペース(現在実行中の関数のネームスペース)、次に囲んでいる関数のローカルネームスペース、グローバルネームスペース、最後にビルトインネームスペースを使用します。インタプリタがあなたにそのメッセージを伝えた理由は、Pythonが Double()の定義を検索する順序のためです。グローバルネームスペースは、ビルドインでそれを探す前にチェックした最後の場所でした(あなたのものではなくPythonのコーディングであるため、インタプリタが "NameError:built-in name 'double'定義されていません")。少なくとも私はこれが起こっていると思います。私はまだ非常に熟練したプログラマーではないので、私は何かが間違っている場合、他の誰かが私を修正すると信じています。

0
追加された