2013-05-16 165 views
1

我是一名新程序員,並且在將新字典名稱作爲參數傳遞給函數時遇到了問題。
我正在嘗試創建一個函數,它將從網頁中下拉數據,併爲主機名和全行數據的值創建一個字典密鑰。有多個頁面具有主機名作爲關鍵值的共同性,我最終會將它們連接在一起。如何將新字典名稱作爲參數傳遞給Python中的函數?

首先,我創建一個名爲control的列表,用作我正在搜索的所有主機的密鑰文件。然後我將值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 

看來這個關鍵字沒有被功能回升。

這是由於範圍?

+0

我不確定它是否僅僅是複製和粘貼代碼,但是你有一大塊代碼需要進一步縮進。在'name = {}'之後,接下來的8行看起來好像縮進得太遠了。 – Matthew

+0

參數不傳遞給函數。它是作爲參數傳遞的對象。參數是在函數定義的括號內定義的標識符 – eyquem

回答

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) 

必讀:How do I pass a variable by reference?

+0

這樣做了!非常感謝幫忙。 – sigsegv

1

你傳遞一個name參數,然後任何使用name之前{}初始化name自己的函數中:好像沒有name ARG傳遞。

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中,如果作爲參數傳遞的對象是可變的,生存在外部作用域中並作爲參數傳遞的變量可以由函數修改(就像它通過引用傳遞的地方一樣,儘管更確切地說,對象的引用是通過值傳遞的, see here

相關問題