2010-07-08 42 views
2

考慮:語義和字符串

args = ['-sdfkj'] 
print args 
for arg in args: 
    print arg.replace("-", '') 
    arg = arg.replace("-", '') 
print args 

這產生了:

['-sdfkj'] 
sdfkj 
['-sdfkj'] 

在哪裏我希望它是['sdfkj']

arg在循環中的副本?

它的行爲就好像它是一個副本(或者可能是不可改變的thingie,但後來我想到一個錯誤會被拋出...)

注:我可以用一個列表理解正確的行爲。我很好奇上述行爲的原因。

回答

8

是arg在循環中的副本嗎?

是的,它包含參考的副本。

當您重新指定arg時,您不會修改原始數組,也不會修改其中的字符串(字符串是不可變的)。您只修改本地變量arg指向的內容。

Before assignment   After assignment 

args   arg   args   arg 
    |   |   |   | 
    |   |   |   | 
(array)  /  (array)  'sdfkj' 
    |[0]  /   |[0]   
    \  /   | 
    \  /    | 
    '-sdfkj'   '-sdfkj' 
+0

是否有語法來表示我要對參考本身操作? – 2010-07-08 17:45:36

+1

@Paul Nathan:不。如果你有一個對數組的引用而不是內容,那麼你可以直接修改數組''args [i] = args [i] .replace(「 - 」,'')'。所以你可以例如使用枚舉循環索引。 – 2010-07-08 17:54:11

1

既然你提到你的問題,你知道它可以使用列表解析完成,我不打算告訴你這種方式。

發生什麼事情是將對每個值的引用複製到變量arg中。最初他們都指向相同的變量。一旦arg被重新分配,它將引用新創建的變量,而列表中的引用保持不變。它與Python中不可變的事實無關。嘗試使用可變類型。

非列表解析的方法是修改到位名單:

for i in xrange(len(args)): 
    args[i]=args[i].replace('-','') 
print args 
0

如果要修改,你必須明確指定更改列表中的實際列表「ARGS」。

for arg in args: 
    if arg == "-": 
     args[arg] = args[arg].replace("-", '') 
+1

這不會工作,除非args是字典。假設它是一個列表,你試圖使用該值作爲索引,這將無法正常工作。 如果args是另一方面的字典,這是有效的,因爲你會循環鍵,並且你會得到預期的行爲。 – Epcylon 2010-07-08 18:36:01

0

的名單我想嘗試:

args = [x.replace("-", '') for x in args]