2017-01-22 27 views
0

8-9。魔術師:列出魔術師的名字。將列表傳遞給名爲show_magicians()的函數,該函數在列表中打印每個魔術師的名字。Python Crash Course Q8-10

8-10。偉大的魔術師:從練習8-9開始你的程序的副本。編寫一個名爲make_great()的函數,通過爲每個魔術師的名字添加短語"the Great"來修改魔術師列表。致電show_magicians()查看該列表實際上已被修改。

8-10: 據我所知,這將工作:

def make_great(list_of_magicians): 
    index = 0 
    while index < len(list_of_magicians): 
     for magician in list_of_magicians: 
      list_of_magicians[index] = "The Great " + magician 
      print(list_of_magicians) # Seeing change in list each time. 
      index += 1 

**問:爲什麼這個不行? **

def make_great(list_of_magicians): 
    for magician in list_of_magicians: 
     magician = 'The great ' + magician 
+0

'magician'不指向列表中的值,但是是副本。如果你想在列表中直接修改它,你需要索引它。 – FlipTack

+0

您可能會發現這篇文章有用:[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html),這是由SO老將Ned Batchelder編寫的。另請參閱[其他語言具有「變量」,Python具有「名稱」](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)。 –

+0

@FlipTack排序。但考慮:在a:u [0] + ='z''中將'a = [['a'],['b'],['c']]''修改'a'中的項目。 –

回答

2

這條線:

magician = 'The great ' + magician 

僅修改所述可變magician。這對列表中的值 沒有影響。

在這種不工作的代碼,相應的線路是:

list_of_magicians[index] = "The Great " + magician 

這改變了列表的實際內容,所以它的工作原理。

+0

換句話說:'''魔術師= ...'''給變量賦值'''魔術師''和'''list_of_magicians [index] = ...'''給列表項分配一些東西。 – wwii

1

for magician in list_of_magicians: 
    magician = 'The great ' + magician 

第一行迭代串中list_of_magicians結合每一個依次名稱magician。它確實不是創建字符串的副本。但是,下一行通過連接'The great 'magician字符串創建一個新字符串,然後=將該新字符串綁定到名稱magician,並且在該操作之後,該名稱不再引用列表項。

如果相反,我們可以做str_prepend('The great ', magician)那麼你的技術會工作,但我們不能這樣做,因爲Python字符串是不可變的。但是這裏有一個使用列表列表的相關示例。而由於名單可變的,我們可以通過修改u改變列出a

a=[['a'], ['b'], ['c']] 
for u in a: 
    u.append('z') 
print(a) 

輸出

[['a', 'z'], ['b', 'z'], ['c', 'z']] 

這裏寫make_great功能的一種方式。在Python中,通常優選直接在容器中的項目上進行迭代,而不是通過索引間接迭代。寫make_great功能的簡單直接的方法是做到這一點:

def make_great(list_of_magicians): 
    new_list = [] 
    for magician in list_of_magicians: 
     new_list.append('The great ' + magician) 
    return new_list 

magician_names = ['Alice', 'Alex', 'Blake'] 
magician_names = make_great(magician_names) 
print(magician_names) 

輸出

['The great Alice', 'The great Alex', 'The great Blake'] 

這將替換原有的magician_names列表以新的清單。如果我們要修改原來的列表對象,我們可以採用分片分配:

magician_names[:] = make_great(magician_names) 

或者,我們可以做切片分配裏面make_great,變異傳入的名單。 Python函數的常規做法是改變它們的參數以返回None

def make_great(list_of_magicians): 
    new_list = [] 
    for magician in list_of_magicians: 
     new_list.append('The great ' + magician) 
    list_of_magicians[:] = new_list 

magician_names = ['Alice', 'Alex', 'Blake'] 
make_great(magician_names) 
print(magician_names) 

或者,我們可以使用列表理解,這是更緊湊(稍微快)做幾乎同樣的事情,並且避免了new_list名需要:

def make_great(list_of_magicians): 
    list_of_magicians[:] = [ 
     'The great ' + magician for magician in list_of_magicians 
    ]