2017-10-15 44 views
2

我是編程新手,偶然發現了這個「奇怪」問題。這裏是我的代碼:當函數退出時,對函數中的變量所做的更改

part_1 = "" 
part_2 = "" 
part_3 = "" 
part_4 = "" 

alphabet = "abcdefghijklmnopqrstuvwxyz" 

import random 

def random_part(part): 
    for x in range (0,4) : 
     part += random.choice(alphabet) 
    print(part) 


random_part(part_1) 

print(part_1) 

目標是創建一個由4個隨機字母組成的字符串。現在,當我運行這段代碼時,我期待它打印字符串2次:1,因爲函數中的「打印」指示和另一個由於打印(part_1)。

事情是,當我運行它,我有一個隨機串和空行,比如:

bdgv 

*empty line* 

換句話說,位於機能的研究工作中的第一印刷指示,但如果我問函數完成後,該變量重置爲「」。 這可能是什麼原因?

回答

4

part += random.choice(alphabet)是局部變量part,不是突變再分配。作爲參數傳遞的字符串不受影響。在Python中,字符串是不可變的,所以你不能將它們傳遞給任何函數,並期望它們已經改變。你不得不返回新的String對象,並具有來電它分配給傳遞的變量:

def random_part(part): 
    for x in range (0,4) : 
    part += random.choice(alphabet) 
    print(part) 
    return part 

part_1 = random_part(part_1) 

順便說一句,在+=操作是否是一個突變或重新分配取決於所涉及的類型的實現神奇的方法__iadd__。例如,對於列表,這是一個突變,您傳遞的參數會發生變化。顯然,對於不可變的類型,它永遠不會是一個變種。