如何避免在调用函数中重新输入长变量名

时间:2017-11-11 18:54:28

标签: python namespaces

如何避免使用以下行:

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)

内部打印语句显示预期:axxxc 调用repl后的print语句显示未更改:abbbbc

当然,如果我放弃并接受冗余打字,它就有效:

this_long_variable_name = repl('b', 'x', this_long_variable_name)
顺便说一下,即使变量的名称是' a,'我不想重新输入a = a.replace(...)

因为在函数s中是一个参数,我不能这样做:     全球的

我甚至尝试过:

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

向你展示了我的理解力度以及我的绝望程度。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是Python字符串是不可变的。 str.replace()会返回一个全新的字符串,因此在s = s.replace(myfind, myreplace)中,名称s不再引用原始字符串,这就是为什么您在函数外部看不到任何更改的原因命名空间。

您的问题可能没有很好的解决方案。我建议使用具有自动完成功能的现代IDE或Python REPL来缓解它。试图滥用标准的写作方式可能对你感觉很好,但是会让其他人看到你的代码时感到困惑。

答案 1 :(得分:0)

哈利它不起作用,因为在你的repl函数中,你实际上有this_long_variable_name内容的本地副本。这称为“通过副本传递”,这意味着python将副本移交给该函数。不幸的是,python就是这样做的。请点击此处:

Python: How do I pass a string by reference?

字符串在python中也是不可变的,所以如果你想改变它们,你总是创建一个新的修改版本。点击这里:

Aren't Python strings immutable?

问题是为什么你首先需要长变量名?