4

在 Pascal 中,我们有var参数,并且函数可以将参数值更改为新值:

procedure a(var S1, S2: string);
begin
  S1:= S1+'test'+S1;
  S2:= S1+'('+S2+')';
end;

Python有这样的功能吗?我可以更改string方法内的参数,还是必须return稍后使用和分配变量?

4

4 回答 4

5

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)

另一种方法是传入可变对象(字典、列表等)并更改它们的内容

于 2013-07-15T10:55:37.107 回答
4

这称为“按引用传递”,不,Python 不这样做(尽管如果您按值传递可变对象并在函数中更改它,它会随处更改,因为它是同一个对象。)

于 2013-07-15T10:55:56.917 回答
1

在 Python 中以不同的方式做可能会更好,请参阅其他答案。

如果你需要通过引用传递一些东西,一个简单的技巧就是传递一个只包含 1 个元素的列表,然后让函数 modify listarg[0]

于 2013-07-15T11:31:18.983 回答
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
    
于 2013-07-15T10:58:49.237 回答