在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行看起来缩进得太远了。参数不会传递给函数。它是作为参数传递的对象。参数是在函数定义的括号内定义的标识符