class x:
    def __init__(self):
        self.y=None
        self.sillyFunc(self.y)
    def sillyFunc(self,argument):
        if argument is None:
            argument='my_name_as_argument'
        self.printy()
    def printy(self):
        print self.y

По мне приведенный выше код должен напечатать> my_name_as_argument, где я иду не так?

1
Bunny Rabbit 20 Июн 2010 в 18:16

3 ответа

Лучший ответ

В Python все является объектом, а переменные содержат ссылки на объекты. Когда вы вызываете функцию, она делает копии ссылок. Некоторые люди, включая Гвидо ван Россум, называют это «Ссылка на вызов по объекту». Важное примечание из Википедии:

функция не может изменить значение, на которое ссылается переменная в своей вызывающей функции.

Код, который вы опубликовали, вообще ничего не печатает. Я думаю, что вы хотите добавить эту дополнительную строку в вашу программу:

x()

Это приводит к выводу: None. Это неудивительно, поскольку вы печатаете значение self.y, но единственное значение, которое вы когда-либо назначаете self.y, это None.

В Python строки неизменны. Переназначение значения argument только перезаписывает локальную копию ссылки. Он не изменяет исходную строку.

Как вы спросили в комментарии, если вы используете изменяемый объект и переназначаете ссылку, опять же это не делает то, что вы хотите - на исходный объект это не влияет. Если вы хотите изменить мутабельный объект, вы можете вызвать метод, который его изменяет. Простое переназначение ссылки не меняет исходный объект.

Если вы хотите, чтобы self.y указывал на новый объект, вы должны назначить ссылку на объект непосредственно self.y.

4
Mark Byers 20 Июн 2010 в 15:16

Это зависит от того, изменяете ли вы сам ссылочный объект (и является ли этот объект изменчивым) или заменяете ссылку на другой объект. Смотрите следующий пример, который использует изменяемый список ...

>>> def test(arg):
...     arg.append(123)
...     
... 
>>> s = []
>>> print s
[]
>>> test(s)
>>> print s
[123]
1
xyz-123 20 Июн 2010 в 14:34

Назначение

argument='my_name_as_argument'

Влияет только на локальную переменную argument. Это не меняет того, на что указывает self.y.

5
Richard Fearn 20 Июн 2010 в 14:23