В Python, что это означает, когда используется *=
. Например:Python: Что означает * = означает?
for i in xrange(len(files)):
itimes[i,:,:] *= thishdr["truitime"]
В Python, что это означает, когда используется *=
. Например:Python: Что означает * = означает?
for i in xrange(len(files)):
itimes[i,:,:] *= thishdr["truitime"]
Это просто означает, что "[выражение слева] = [сам] * [выражение справа]":
itimes[i,:,:] *= thishdr["truitime"]
эквивалентно
itimes[i,:,:] = itimes[i,:,:] * thishdr["truitime"]
Ну, технически он вызывает метод '__imul__' левой стороны, который может что-то сделать. – Marcin
Он пытается выполнить умножение на месте, если левая сторона реализует версию на месте. – user2357112
В аналогичном ключе '+ =', '- =', '/ =', '// =' '& =', '| =', '<< =', '** =', '> > = ', а'^= 'должны делать все, что вы ожидаете от них, предполагая, что у вас есть разумные определения' __imul__', '__iadd__' и т. д. – vroomfondel
Это означает «установить эту переменную в себя раз»
>>> fred = 10
>>> fred *= 10
>>> fred
100
>>> barney = ["a"]
>>> barney *= 10
>>> barney
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
Как уже объяснили, что это приблизительный эквивалент:
[object] = [object] * [another_object]
Однако, это не совсем то же самое. Технически, вышеупомянутое вызывает функцию __mul__
, которая возвращает значение и переназначает его обратно на имя.
Например, у нас есть объект A
и его умножение на B
. Процесс выглядит примерно так:
> Call the __mul__ function of object A,
> Retrieve the new object returned.
> Reassign it to the name A.
Выглядит просто. Теперь, делая *=
, мы не вызываем метод __mul__
, а вместо него __imul__
, который попытается изменить себя. Процесс выглядит примерно так:
> Call the __imul__ function of object A,
> __imul__ will change the value of the object, it returns the modified object itself
> The value is reassigned back to the name A, but still points to the same place in memory.
С этим вы изменяете его на месте, не создавая новый объект.
И что? Это выглядит так же.
Не совсем. Если вы заменяете объект, вы создали новое место для него в памяти. Если вы измените его на месте, местоположение объекта в памяти всегда будет одинаковым.
Взгляните на эту консольную сессию:
>>> a = [1, 2, 3]
>>> b = a
>>> c = 10
>>> a = a * c
>>> print a
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> b
[1, 2, 3]
Если проверить адрес памяти:
>>> id(a) == id(b)
ложных
Используя это значение b
не изменяется, так как a
теперь просто указывает на другое место. Но использование *=
:
>>> a = [1, 2, 3]
>>> b = a
>>> c = 10
>>> a *= c
>>> b
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
И если мы проверяем адрес памяти:
>>> id(a) == id(b)
True
Операция влияет b
, а также. Это может быть сложно и иногда приводит к запутанному поведению. Но как только вы это поймете, с ним будет легко справиться.
Надеюсь, это поможет!
'__imul__' * * * возвращает свой результат (обычно это' self'), и этот результат * * присваивается переменной. – lvc
О? Виноват. Будут обновлены, спасибо большое! – aIKid
Теперь я смущен. Оказывается, я знаю меньше, чем думал. @lvc Можете ли вы, пожалуйста, помочь мне понять это? Какая разница? Между тем, я удалю свой ответ. Можете ли вы прийти в [чат] (http://chat.stackoverflow.com/rooms/6/python)? – aIKid
@ Luke Singham Я одобрил ваше редактирование. При редактировании, пожалуйста, также [удалите такие вещи, как «спасибо»] (https://meta.stackexchange.com/q/2950/168333). –