2013-09-21 1 views
0

Я пытаюсь в основном создавать ссылки для построения нескольких отношений и хранить их в списке или, возможно, в словаре.Несколько ссылок в отдельных списках; Python

В основном:

variable1 = 10

// в данном случае, 'ссылка' означает, что переменная должна быть ссылка)
listA = [variable1(ref), variable2, variable3]
listB = [variable1(ref), variable4, variable5]

for i in listA:
i = i + 10

for i in listB:
i = i + 10

print listA[0]
// Если печать 30

print listB[0]
// Если печать 30

Как я могу разделить две ссылки на одной и той же переменной в двух отдельных списков?

+0

да с mutables, ни с immutables – tacaswell

+0

насчет двух списков, каждый из которых содержит ключи той же коллекции, скажем, словарь? – jedwards

+0

tcaswell, не могли бы вы уточнить. Какой будет синтаксис? Есть ли изменяемая/неизменная команда? –

ответ

1

Как насчет двух списков, каждый из которых содержит ключи той же коллекции, скажем, словарь?

Например:

MASTER = [10,11,12,13,14] 

LISTA = [0,1,2] 
LISTB = [0,3,4] 

for i in LISTA: MASTER[i] += 10 
for i in LISTB: MASTER[i] += 10 

print MASTER[LISTA[0]] 

print MASTER[LISTB[0]] 

ideone example

Или с помощью класса-оболочки:

class SharedInt: 
    val = None 
    def __init__(self, v): self.val = v 

    def __add__(self, a): 
     self.val += a 
     return self.val 

    def __int__(self): return self.val 

v1 = SharedInt(10) 

listA = [v1, 11, 12] 
listB = [v1, 13, 14] 

for i in listA: i += 10 
for i in listB: i += 10 

print int(listA[0]) 
print int(listB[0]) 

ideone example

Наконец, или с помощью встроенных списков:

v1 = [10] 

listA = [v1, 11, 12] 
listB = [v1, 13, 14] 

for i in listA: 
    if isinstance(i, list): i[0] += 10 
    else: i += 10 
for i in listB: 
    if isinstance(i, list): i[0] += 10 
    else: i += 10 

print listA[0] 
print listB[0] 

ideone example

Обратите внимание, что первый пример относится к всем вашим членам ListX как «ссылка», а последние два примера трактует член, как «ценность», если вы сделаете их SharedInt() с или вложить их в список соответственно.

Другими словами,

 
LISTA[1] = 21 # First example 
ListA[1] = 11 # Second, third examples 
+0

Эти оба работают, но я искал более чистую команду, потому что это станет кошмаром в программе, которую я пишу. Есть ли способ установить тип переменной в изменяемый, неизменяемый? В противном случае мне просто придется использовать словарь. –

+0

Ну, ints всегда будет передаваться «по значению» (на самом деле, ссылка на неизменяемый объект), поэтому вам нужно что-то сделать, чтобы этого не произошло. Обертка его в списке (пример 3) является распространенной техникой, но невозможно передать ее «по ссылке» как обычный стандарт. – jedwards

+0

[Этот связанный вопрос] (http: // stackoverflow.com/questions/15148496/python-through-an-integer-by-reference), есть еще одно обсуждение, но результат тот же, к сожалению. – jedwards