1

我是一名新程序员,在将新字典名称作为参数传递给函数时遇到问题。
我正在尝试创建一个函数,该函数将从网页中提取数据并为主机名创建字典键和整行数据的值。有多个页面将主机名的共性作为键值,我最终将它们连接在一起。

首先,我创建了一个名为controlused 作为我正在搜索的所有主机的密钥文件的列表。然后我将值webpage、、delimiterdictionary 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',你应该传递 object 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)

然后有两条评论

  • 如果要修改字典,请将其作为参数传递,而不是其名称

  • 有一点你是对的:在 Python 中,如果作为参数传递的对象是可变的,那么位于外部范围内并作为参数传递的变量可以由函数修改(就好像它通过引用传递一样,虽然它更准确对对象的引用是按值传递的,请参见此处

于 2013-05-16T17:48:49.660 回答