在 Pascal 中,我们有var
参数,并且函数可以将参数值更改为新值:
procedure a(var S1, S2: string);
begin
S1:= S1+'test'+S1;
S2:= S1+'('+S2+')';
end;
Python有这样的功能吗?我可以更改string
方法内的参数,还是必须return
稍后使用和分配变量?
在 Pascal 中,我们有var
参数,并且函数可以将参数值更改为新值:
procedure a(var S1, S2: string);
begin
S1:= S1+'test'+S1;
S2:= S1+'('+S2+')';
end;
Python有这样的功能吗?我可以更改string
方法内的参数,还是必须return
稍后使用和分配变量?
Python 可以返回多个值(以元组的形式),不再需要通过引用传递值。
在您的简单示例案例中,即使您能够应用相同的技术,也无法获得相同的结果,因为 Python 字符串是不可变的。
因此,您的简单示例可以转换为 Python:
def a(s1, s2):
s1 = '{0}test{0}'.format(s1)
s2 = '{}({})'.format(s1, s2)
return s1, s2
foo, bar = a(foo, bar)
另一种方法是传入可变对象(字典、列表等)并更改它们的内容。
这称为“按引用传递”,不,Python 不这样做(尽管如果您按值传递可变对象并在函数中更改它,它会随处更改,因为它是同一个对象。)
在 Python 中以不同的方式做可能会更好,请参阅其他答案。
如果你需要通过引用传递一些东西,一个简单的技巧就是传递一个只包含 1 个元素的列表,然后让函数 modify listarg[0]
。
如果你绝对必须,你可以这样做:
class ValueHolder(object):
def __init__(self, value):
self.value = value
def a(s1, s2):
s1.value += 'test' + s1.value
s2.value = '{}({})'.format(s1.value, s2.value)
s1 = ValueHolder('spam')
s2 = ValueHolder('eggs')
a(s1, s2)
print s1.value, s2.value
但这是一种非常丑陋的方式。
会更好
返回更改值的函数
def a(s1, s2):
return s1 + 'test' + s1, s2 + 'aaa'
或保存旧数据和新数据的类。
class StringModifier(object)
def __init__(self, s1, s2):
self.s1 = s1
self.s2 = s2
def a(self):
self.s1 += 'test' + self.s1
self.s2 = '{}({})'.format(self.s1, self.s2)
sm = StringModifier('spam', 'eggs')
sm.a()
print sm.s1, sm.s2