我怎样才能避免调用函数重新输入长变量名

我怎样才能避免调用函数重新输入长变量名

问题描述:

我怎样才能避免这样的行:我怎样才能避免调用函数重新输入长变量名

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)唯一的解决方案不涉及做难看的事情。 –

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

这可能不是一个很好的解决您的问题。我建议使用具有自动完成功能的现代IDE或Python REPL来缓解它。尝试滥用写这样的东西的标准方式可能会让你感觉不错,但它会让其他人看着你的代码感到困惑。

+0

我使用Notepad ++,并辅以一些Autohotkey宏。不理想,但不坏。有没有一个IDE可以让所有酷酷的孩子们使用? –

+0

@HarryBinswanger我喜欢PyCharm,但有很多选择。谷歌搜索“python ide”会给你一个概述。 –

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

谢谢,所有。我回应了避免“臭”代码的愿望。简而言之,这首先激发了这一点。我明白字符串是不可变的,我几乎可以理解通过引用与按值传递。几乎。 :)我使用长文件名(很少和我的例子一样)来使代码自我记录。好吧,不是自我记录,而是朝着这个方向迈出的一步。感谢所有人,我接受了鞠躬头的失败。 –