2017-12-18 84 views
5

IssueĐối với loop được ghi đè lên các giá trị trong danh sách từ điển

Tôi đã thực hiện một vòng lặp for đọc nội dung của một danh sách tuy nhiên khi gán hai giá trị để một cuốn từ điển và sau đó gắn thêm rằng đầu ra vào một danh sách, tiếp theo giá trị ghi đè tất cả mọi thứ trong danh sách

mong muốn kết quả

tôi muốn thêm nhiều từ điển vào một danh sách như vậy khi tôi chạy một vòng lặp for và in tất cả mọi thứ liên quan đến 'ip' nó sẽ in tất cả các giá trị liên quan đến từ điển giá trị 'ip'.

device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 
    # do some text stripping 
    x = x.split(' ') 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 

Mẫu mã

chỉ số 1 của nội dung là:

x[0] = '10.10.10.1' 
x[1] = 'aa:bb:cc:dd' 

Chỉ số thứ 2 của nội dung là:

x[0] = '20.20.20.1' 
x[1] = 'qq:ww:ee:ee:rr' 

Điều gì thực sự xảy ra

listofdevices[0] 'ip': 20.20.20.1, 'mac': 'qq:ww:ee:ee:rr' 
    listofdevices[1] 'ip': 20.20.20.1, 'mac': 'qq:ww:ee:ee:rr' 
+2

Nó không liên quan gì đến bản thân vòng lặp 'for': danh sách chứa hai tham chiếu đến từ điển * cùng *. –

+0

Vì vậy, bạn đang nói rằng tôi sẽ phải sử dụng một số chỉ mục để tạo một từ điển mới và nối thêm các giá trị vào số chỉ mục liên quan đến từ điển? –

+1

không, nó không liên quan gì đến việc sử dụng các chỉ mục, bạn phải xây dựng một từ điển * mới * mỗi lần. –

Trả lời

0

Bạn chưa tạo ra một đối tượng từ điển mới mỗi lần. Bạn chỉ đơn giản là biến đổi cùng một đối tượng trong mỗi lần lặp. Hãy thử sao chép sâu từ điển bằng cách sử dụng mô-đun copy. Sau đó, sau khi lấy bản sao này, hãy thay đổi bản sao đó và thêm vào danh sách:

import copy 
device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 

    device = copy.deepcopy(device) #creates a deep copy of the values of previous dictionary. 
    #device now references a completely new object 

    # do some text stripping 
    x = x.split(' ') 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 
2

Hãy thử mã này. Mỗi thiết bị đang cố chỉnh sửa cùng một bản sao của một từ điển.

listofdevices = [] 

def begin(): 
    with open("outputfromterminal", 'r') as f: 
     contents = f.read().split(',')[1:] 

    for line in contents: 
     # do some text stripping 
     line = line.split(' ') 

     device = { 'ip': line[0], 
        'mac': line[1], 
        'username': 'admin', 
        'password': [], 
        'device type': '', 
        } 

     listofdevices.append(device) 
+0

Không thể là "cùng một bản sao" khi có * không * sao chép ... –

+1

Bạn đang nói về điều gì? Có một bản sao của một từ điển trong mã gốc. Không, từ điển đã không được .copy() 'd, nhưng nó là một bản sao của một từ điển. –

+0

Tôi không thấy như thế nào. Đó là một bản sao của * mà * từ điển? –

0

Vấn đề là do việc thêm vào danh sách. Khi bạn thêm một mục (trong trường hợp của bạn là một từ điển). Nó không tạo ra một từ điển, nhưng nó chỉ đơn giản là đặt tham chiếu.

Nó sẽ hoạt động nếu bạn có thể khởi tạo từ điển trong vòng lặp cho mỗi lần, Vì vậy, một tham chiếu mới được tạo ra.

listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 
    # do some text stripping 
    x = x.split(' ') 
    device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 
Các vấn đề liên quan