Причина
args[0] = 4
не работает, потому что, как говорится в сообщении об ошибке, args
кортеж, который является неизменным. Итак, вам нужно сначала преобразовать его в изменяемый объект, например, так:
>>> def foo( *args ):
print(args)
args = list(args)
args[0] = 42
print(args)
>>> foo(23)
(23,)
[42]
Если вы дадите больше информации, можно будет найти более питонное решение, потому что то, что вы делаете, кажется странным Кроме того, второй код, кажется, работает очень хорошо.
Например, следующее работает просто отлично и меняет вызывающую переменную области видимости:
>>> def spam(*a):
a[0][0] = 42
>>> l = [23, 32]
>>> spam(l)
>>> l
[42, 32]
Причина в том же смысле: изменчивость объекта l
. То же самое можно показать на вашем примере:
>>> def foo( *input ):
input[0].obj = "something else"
>>> b = bar('abc')
>>> foo(b)
>>> b.obj
'something else'