2013-09-07 9 views
2

Если я определитьЗачем использовать а = Ь в Python

foo = [[1,2],[2,3],[3,4]] 
bar = foo 

затем Foo и бар, ссылки на один и тот же объект, а именно [[1,2], [2,3], [3,4]]. Теперь я могу использовать любой из этих «тегов/пространств имен/ссылок» для внесения изменений в объект [[1,2], [2,3], [3,4]], но как это полезно для всех?

+6

Как это не полезно? * Все * в Python является ссылкой. Список записей - это ссылки. Вызов функции создает новые ссылки. Атрибуты - это ссылки. ** Вы еще не знаете об этом **. –

+0

a должно было быть foo. Я очень сожалею о своей ошибке – John

+0

Тот факт, что вы спрашиваете о списке списков, задает вопрос «запах смешной». Вы спрашиваете о изменчивости * внешнего * списка или * внутренних *? IOW, более интересен 'bar = foo' или тот факт, что' bar = foo [:] 'создает неглубокую копию, так что даже сейчас' bar [0] [1] = 5' changes 'foo [0] [1 ] '*, хотя foo и bar - разные списки *? – kojiro

ответ

1

Скажем, у меня есть атрибут моего экземпляра класса, frobnoz, ссылка на экземпляр Frobnoz класса, который, в свою очередь атрибут marfoos, который представляет собой список всех связанных с ними marfoos, и я хочу, чтобы выполнить несколько операций на первый.

marfoo = self.frobnoz.marfoos[0] 
marfoo.rotate(CLOCKWISE, degrees=90) 
if marfoo.is_cloudy(): 
    self.purge_clouds(marfoo) 

Если бы это было не возможно создать дополнительную ссылку на марфу я хотел, чтобы выполнить действия, я бы должен был не только длинные ссылки на него, но и взять на себя расходы по отрываясь и frobnoz и marfoos ссылки плюс первый элемент списка каждый раз, когда я хотел его использовать.

+0

Спасибо за прямой ответ на вопрос – John

0

Это полезно (среди прочего) для вызовов функций, которые изменяют значение:

def changeFoo(bar):  
    bar[0][0]=3.14 

changeFoo(foo) 

Примечание: Это технически не использовать задания, но это эквивалентно.

Он также может использоваться, когда несколько объектов должны иметь ссылку на один и тот же объект (например, в linked lists).

2

Одна из причин, по которой может быть полезно переименовать имена в существующие значения, - это если вы собираетесь повторно использовать исходное имя для другого объекта. Так, например, эта функция для вычисления n го числа в последовательность Фибоначчи повторно использует имена a, b и temp многократно в цикле, связывающий значение ранее, на который ссылается a к b (через Temp) каждый раз, когда:

def fib(n): 
    a = 1 
    b = 0 
    for _ in range(n): 
     temp = a 
     a = a+b 
     b = temp 
     # A more Pythonic version of the last three lines would be: a, b = a+b, a 
    return b 
+0

Я не думаю, что это относится к моему вопросу, потому что целые числа являются неизменяемым объектом, а список - изменчивым объектом. – John

+0

@John: Это правда, что целые числа неизменны и списки, которые вы дали в качестве примера в своем вопросе нет, но я не думаю, что это критическая проблема для вашего вопроса о том, почему вы хотите связать новое имя с уже существующим объектом с чем-то вроде 'a = b'. Независимо от того, являются ли объекты изменчивыми или нет, общая причина для такого назначения заключается в том, что позже вы будете связывать 'b' с другим объектом, но вам все равно нужна ссылка на его старое значение. – Blckknght