1

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

>>> import aiyoo
>>> aiyoo.bixidist(1,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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

double 関数は、XML からの Unicode 出力を、後続の関数の入力として double に変換するために使用されました。なぜかわかりませんが、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('<id>','').replace('</id>','')
    xmlID = int(xmlID)
    return xmlID

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

def getLong(i):
    xmlLong = dom.getElementsByTagName('long')[i].toxml()
    xmlLong = xmlLong.replace('<long>','').replace('</long>','')    
    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)
4

4 に答える 4

3

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

そして、あなたの質問の主要部分、つまり「ダブルがグローバル名と見なされたのはなぜですか?」については、ローカルコンテキストでは見つからないvariable-namesayを使用すると、次のルックアップはグローバルコンテキストになります。doubleその後、グローバルコンテキストでも見つからない場合は、例外が発生し、NameError: global name 'double' is not defined.

ハッピーコーディング。

于 2011-11-25T06:37:43.860 に答える
1

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

于 2011-11-25T06:25:03.830 に答える
0

これまでの他の2つの回答が述べたように、Pythonにはdouble変数型がなく、代わりにfloat.

さて、あなたのタイトルの質問と、おそらくあなたにとって別の混乱の原因です. インタプリタが「NameError: global name 'double' is not defined」と言っている理由は、Python が関数、変数、オブジェクトなどの名前を検索する方法のためです。このパターンは、Python の名前空間とスコープの規則によって記述されています。Double修飾せずに関数内から存在しない関数を呼び出そうとしたため(つまりSomeObject.Double(x))、Python は最初にローカル名前空間 (実行中の現在の関数の名前空間) でその名前のオブジェクトを探し、次にそのオブジェクトのローカル名前空間を探します。囲んでいる関数、次にグローバル名前空間、最後に組み込み名前空間です。インタプリタがそのメッセージを表示した理由は、Python が定義を検索する順序のためです。Double(). グローバル名前空間は、組み込みで検索する前に最後にチェックした場所でした (これは Python のコーディングであり、あなたのものではないため、インタープリターが「NameError: 組み込みの名前 'double'」と言うのは意味がないと思います)。定義されていません")。少なくとも私はこれが起こっていると思います。私はまだ熟練したプログラマーではないので、何か間違っていたら誰かが訂正してくれると信じています。

于 2011-11-25T07:10:10.420 に答える
0

そのはずxmlLat = float(xmlLat)

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

http://codepad.org/AayFYhEd

于 2011-11-25T06:23:38.770 に答える