2017-11-11 166 views
1

我怎樣才能避免這樣的行:我怎樣才能避免調用函數重新輸入長變量名

this_long_variable_name = this_long_variable_name.replace('a', 'b') 

我想我可以做一個函數,REPL避免它,

def repl(myfind, myreplace, s): 
     s = s.replace(myfind, myreplace) 
     print(s) # for testing purposes 
     return s 

但由於關於本地和全局命名空間的東西,我不明白,我不能讓函數返回this_long_variable_name的更改值。以下是我已經試過:

this_long_variable_name = 'abbbc' 
repl('b', 'x', this_long_variable_name) 
print('after call to repl, this_long_variable_name =', this_long_variable_name) 

內部print語句顯示預期:axxxc 調用REPL後print語句顯示不變:abbbbc

當然,它的工作原理,如果我放棄並接受多餘的打字:

this_long_variable_name = repl('b', 'x', this_long_variable_name) 

順便說一句,這不只是關於什麼被重新輸入的長度,即使該變量的名稱是「一個,」我不希望重新輸入一個= a.replace(。 ..)

由於在功能s是一個參數,我不能這樣做: 全球小號

我甚至嘗試:

this_long_variable_name.repl('b', 'x') 

這表明你怎麼都有點我理解,以及如何絕望的我。

+1

字符串是不可變的,參數是*按值調用*所以你不能這樣做。 –

+0

我的意思是說,出於某種原因我們可以這樣做。 'repl('a','b',some_function_call('with','arguments'))'的結果是什麼?在這種情況下,沒有對字符串的引用(我們有)。 –

+0

恐怕輸入它是你最好的選擇。雖然是的,但是有些事情可以解決這個問題,他們所要做的就是讓代碼變得很臭。輸入它是1)對於閱讀你的代碼的人來說至少是令人困惑的,2)唯一的解決方案不涉及做難看的事情。 –

回答

1

您遇到的問題是Python字符串是不可變的。 str.replace()返回一個全新的字符串,因此在s = s.replace(myfind, myreplace)中,名稱s不再引用原始字符串,這就是爲什麼在函數名稱空間的外部看不到任何更改的原因。

這可能不是一個很好的解決您的問題。我建議使用具有自動完成功能的現代IDE或Python REPL來緩解它。嘗試濫用寫這樣的東西的標準方式可能會讓你感覺不錯,但它會讓其他人看着你的代碼感到困惑。

+0

我使用Notepad ++,並輔以一些Autohotkey宏。不理想,但不壞。有沒有一個IDE可以讓所有酷酷的孩子們使用? –

+0

@HarryBinswanger我喜歡PyCharm,但有很多選擇。谷歌搜索「python ide」會給你一個概述。 –

0

Harry不起作用,因爲在您的repl功能中,您實際上擁有this_long_variable_name的內容的本地副本。這被稱爲「通過複製」,這意味着python將副本移交給函數。不幸的是,這是python如何做到的。檢查也在這裏:

Python: How do I pass a string by reference?

而且字符串在Python不變,所以如果你想改變它們,你總是創建一個新的修改版本。查看此處:

Aren't Python strings immutable?

的問題是,你爲什麼要在第一時間需要長變量名?

+0

Python不是通過複製 - 請參閱[本講座](https://youtu.be/_AEJHKGk9ns)以獲得絕佳的概述。 –

+0

謝謝,所有。我回應了避免「臭」代碼的願望。簡而言之,這首先激發了這一點。我明白字符串是不可變的,我幾乎可以理解通過引用與按值傳遞。幾乎。 :)我使用長文件名(很少和我的例子一樣)來使代碼自我記錄。好吧,不是自我記錄,而是朝着這個方向邁出的一步。感謝所有人,我接受了鞠躬頭的失敗。 –

相關問題