2013-12-16 15 views
3

В Python, что это означает, когда используется *=. Например:Python: Что означает * = означает?

for i in xrange(len(files)): 
    itimes[i,:,:] *= thishdr["truitime"] 
+0

@ Luke Singham Я одобрил ваше редактирование. При редактировании, пожалуйста, также [удалите такие вещи, как «спасибо»] (https://meta.stackexchange.com/q/2950/168333). –

ответ

6

Это просто означает, что "[выражение слева] = [сам] * [выражение справа]":

itimes[i,:,:] *= thishdr["truitime"]

эквивалентно

itimes[i,:,:] = itimes[i,:,:] * thishdr["truitime"]

+13

Ну, технически он вызывает метод '__imul__' левой стороны, который может что-то сделать. – Marcin

+0

Он пытается выполнить умножение на месте, если левая сторона реализует версию на месте. – user2357112

+1

В аналогичном ключе '+ =', '- =', '/ =', '// =' '& =', '| =', '<< =', '** =', '> > = ', а'^= 'должны делать все, что вы ожидаете от них, предполагая, что у вас есть разумные определения' __imul__', '__iadd__' и т. д. – vroomfondel

0

Это означает «установить эту переменную в себя раз»

>>> fred = 10 
>>> fred *= 10                                                        
>>> fred                                                          
100                                                           
>>> barney = ["a"]                                                        
>>> barney *= 10                                                        
>>> barney 
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']                                               
4

Как уже объяснили, что это приблизительный эквивалент:

[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, а также. Это может быть сложно и иногда приводит к запутанному поведению. Но как только вы это поймете, с ним будет легко справиться.

Надеюсь, это поможет!

+0

'__imul__' * * * возвращает свой результат (обычно это' self'), и этот результат * * присваивается переменной. – lvc

+0

О? Виноват. Будут обновлены, спасибо большое! – aIKid

+0

Теперь я смущен. Оказывается, я знаю меньше, чем думал. @lvc Можете ли вы, пожалуйста, помочь мне понять это? Какая разница? Между тем, я удалю свой ответ. Можете ли вы прийти в [чат] (http://chat.stackoverflow.com/rooms/6/python)? – aIKid

Смежные вопросы