在Python中,如何将新字典名作为参数传递给函数?

在Python中,如何将新字典名作为参数传递给函数?,python,Python,我是一名新程序员,在将新字典名作为参数传递给函数时遇到问题。 我正在尝试创建一个函数,该函数将从网页中提取数据,并为主机名和整行数据的值创建一个字典键。有多个页面具有主机名作为键值的公共性,我最终将它们合并到一行中 首先,我创建一个名为control的列表,用作我正在搜索的所有主机的关键文件。然后,我将值网页、分隔符和字典名传递给函数。 执行此操作时,字典的名称似乎没有传递给函数 #open key file f = open("./hosts2", "r") control = [] for

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

首先,我创建一个名为
control
的列表,用作我正在搜索的所有主机的关键文件。然后,我将值
网页
分隔符
字典名
传递给函数。
执行此操作时,字典的名称似乎没有传递给函数

#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
该函数似乎没有提取关键字


这是由于作用域引起的吗?

您不应该传递字符串
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)

必须阅读:

而不是传递字符串
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)

必须阅读:

您传递一个
名称
参数,然后在使用
名称
之前,在函数内部用
{}
初始化
名称
:就好像没有传递
名称
参数一样

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中,如果作为参数传递的对象是可变的,则函数可以修改位于外部作用域中并作为参数传递的变量(就好像它是通过引用传递的,尽管对对象的引用更确切地说是通过值传递的,)


您传递一个
名称
参数,然后在使用
名称
之前,在函数内部用
{}
初始化
名称
:就好像没有传递
名称
参数一样

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中,如果作为参数传递的对象是可变的,则函数可以修改位于外部作用域中并作为参数传递的变量(就好像它是通过引用传递的,尽管对对象的引用更确切地说是通过值传递的,)


成功了!非常感谢你的帮助,成功了!非常感谢您的帮助。我不确定这是否只是因为复制和粘贴了您的代码,但是您的代码块缩进得太深了。在
name={}
之后,接下来的8行看起来缩进得太远了。参数不会传递给函数。它是作为参数传递的对象。参数是在函数定义的方括号内定义的标识符。我不确定它是否仅仅是复制和粘贴代码的结果,但您的代码块缩进的程度超出了需要。在
name={}
之后,接下来的8行看起来缩进得太远了。参数不会传递给函数。它是作为参数传递的对象。参数是在函数定义的括号内定义的标识符