2017-06-14 40 views
0

我想填充每個對象的字典,每個對象都有一個字符串列表,全部來自給定的字符串列表。問題是,當我想替換字典的單個元素時,每個元素都會改變。在Python中替換單個元素元素

Person類:

class Person: 

    messages = [] 

    def __init__(self, p): 
     self.name = p 

    def add_message(self, m_text): 
     self.messages.append(m_text) 

主要代碼:

chat_messages_list = ["Eva: Eva's first text", "Eva: Eva's second text", "Eva: Eva's third text", 
         "Harry: Harry's first text", "Harry: Harry's second text", "Harry: Harry's third text", 
         "Ellis: Ellis' first text", "Ellis: Ellis' second text", "Ellis: Ellis' third text"] 
dict_persons = {} 

for element in chat_messages_list: 

    split_messages = element.split(": ") 
    name = split_messages[0] 
    message_text = split_messages[1] 

    # Create Person in list if not already exists 
    if name not in dict_persons: 
     dict_persons[name] = Person(name) 

    person = dict_persons[name] 

    # THE PROBLEM: Following line will add message_text to EVERY Person in dict_persons 
    person.add_message(message_text) 

for key, value in dict_persons.items(): 
    print("{0}: {1}".format(key, value.messages)) 

預期結果:

Eva: ["Eva's first text", "Eva's second text", "Eva's third text"] 
Harry: ["Harry's first text", "Harry's second text", "Harry's third text"] 
Ellis: ["Ellis' first text", "Ellis' second text", "Ellis' third text"] 

實際結果:

Eva: ["Eva's first text", "Eva's second text", "Eva's third text", "Harry's first text", "Harry's second text", "Harry's third text", "Ellis' first text", "Ellis' second text", "Ellis' third text"] 
Ellis: ["Eva's first text", "Eva's second text", "Eva's third text", "Harry's first text", "Harry's second text", "Harry's third text", "Ellis' first text", "Ellis' second text", "Ellis' third text"] 
Harry: ["Eva's first text", "Eva's second text", "Eva's third text", "Harry's first text", "Harry's second text", "Harry's third text", "Ellis' first text", "Ellis' second text", "Ellis' third text"] 

Wy是字符串被添加到字典中的所有對象,而不是隻是所需的一個?

+3

是的,當然,因爲你是*附加到同一個列表*,也就是說,你添加到你在類中定義的列表中作爲'messages = []',這是一個* class級別屬性*共享通過*所有實例*。 –

回答

3

初始化messages字段Person__init__,即self.messages = []使其成爲實例字段。
現在它是一個類級別的字段,因此所有實例共享相同的列表。

1

嘗試把messages = []在您的init:

class Person: 

    def __init__(self, p): 
     self.name = p 
     self.messages = [] 

    def add_message(self, m_text): 
     self.messages.append(m_text) 

這爲我工作!