1

私は新しいプログラマーで、新しい辞書名をパラメーターとして関数に渡すことに問題があります。
Webページからデータを取得し、ホスト名の辞書キーとデータの全行の値を作成する関数を作成しようとしています. ホスト名をキー値とする共通性を持つページが複数あり、最終的にはそれらを 1 つの行に結合します。

まず、control探しているすべてのホストのキー ファイルとして使用されるというリストを作成します。次に、値webpagedelimiter、およびdictionary nameを関数に渡します。
これを行うと、辞書の名前が関数に渡されていないようです。

#open key file
f = open("./hosts2", "r")
control = []
for line in f:
    line = line.rstrip('\n')
    line = line.lower()
    m = re.match('(^[\w\d]+)', line)
    control.append(m.group())
# Close key file
f.close()

def osinfo(url, delimiter, name=None):
    ufile = urllib2.urlopen(url)
    ufile.readline()
    name = {}
    for lines in ufile.readlines():
        lines = lines.rstrip("\n")
        fields = lines.split(delimiter)
        m = re.match(r'(?i)(^[a-z0-9|\.|-]+)', fields[1].lower())
        hostname = m.group()
        if hostname in control:
            name[hostname] = lines
    print "The length of osdata inside the function:", len(name)

osdata = {}
osinfo(‘http://blahblah.com/test.scsv’, ';', name='osdata')
print "The length of osdata outside the function", len(osdata)

出力は次のとおりです。

$./test.py
The length of osdata inside the function: 11
The length of osdata outside the function: 0

関数でキーワードが拾われていないようです。

これはスコープによるものですか?

4

2 に答える 2

3

文字列を渡す代わりにname='osdata'、オブジェクトを渡す必要がありますname=osdata

関数内で再度定義しないでください: name = {}、そうしないと、元のオブジェクトへの参照が失われます。

>>> def func(name=None):
    name ={}         #redefine the variable , now reference to original object is lost
    return id(name)
... 
>> dic={}
>>> id(dic),func(dic)   #different IDs
(165644460, 165645684)

必読:変数を参照渡しするにはどうすればよいですか?

于 2013-05-16T17:48:44.283 に答える
1

引数を渡し、引数が渡されなかったかのように、 : を使用する前に関数内でname初期化nameします。{}namename

def osinfo(url, delimiter, name=None):
    ufile = urllib2.urlopen(url)
    ufile.readline()
    name = {}                               # you define name here as empty dict
        for lines in ufile.readlines():
            lines = lines.rstrip("\n")
            fields = lines.split(delimiter)
            m = re.match(r'(?i)(^[a-z0-9|\.|-]+)', fields[1].lower())
            hostname = m.group()
            if hostname in control:
                name[hostname] = lines
        print "The length of osdata inside the function:", len(name)

それから2つのコメント

  • 辞書を変更する場合は、名前ではなく引数として渡します

  • あなたは1つの点で正しいです:Pythonでは、引数として渡されたオブジェクトが可変である場合、スコープ外にあり、引数として渡された変数は、関数によって変更できます(より正確には参照によって渡されたかのように)オブジェクトへの参照が値渡しされることを確認するには、こちらを参照してください)

于 2013-05-16T17:48:49.660 に答える