2015-10-26 4 views
2

Я хочу иметь такую ​​функциональность, как показано ниже. Я много пробовал, но до сих пор не могу этого добиться.Reference Equality Python

>>> a, b = [1], [2] 
>>> k = [a, a, b] 
>>> k 
[[1], [1], [2]] 

Теперь, как и ожидалось, если я изменю второе значение, первое значение будет изменено автоматически.

>>> k[0][0] = 3 
>>> k 
[[3], [3], [2]] 

Вы видите, как изменение одного значения влияет на другое.

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

>>> *Do something to link k[1] or k[0] with k[2]* 
>>> k[-1][0] = 4 
>>> k 
>>> [[4], [4], [4]] 

Я попытался сделать следующее и не, как вы можете увидеть ниже:

>>> b = a 
>>> k 
>>> [[3], [3], [2]] 

Пожалуйста, помогите мне достичь выше.

Настоящая проблема, которую я хочу решить: Я реализую алгоритм минимального разреза. В этом алгоритме мне нужно объединить две вершины на каждом шаге. Я пытаюсь сделать это, соединяя две вершины вместе, которые я хочу объединить.

+0

Пожалуйста, не могли бы вы уточнить ваш вопрос? Некоторые из приведенных вами примеров не работают. Например, первый блок ('' a, b = [1], [1], [2] ... '') поднимет значение «ValueError: слишком много значений для распаковки». Во втором блоке вы назначаете '' str'', но результат, который вы показываете, является '' int''. – Leo

ответ

2

Это то, что вы хотите?

a,b = [1],[2] 
k = [a,a,b] # store references to lists a and b 
print(k) 
k[0][0] = 3 # change the first cell's list's first element 
print(k)  # second cell changes as well since it references same list 
k[-1] = k[0] # store the first cell's reference in the last cell. All reference the same list 'a' now. 
k[1][0] = 4 
print(k) 

Выход:

[[1], [1], [2]] 
[[3], [3], [2]] 
[[4], [4], [4]]