2015-11-05 3 views
0

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

a = 1 
b = 2 
c = 3 

aa = 0 
bb = 0 
cc= 0 

list = [[1, a] ,[2, b] ,[3 ,c]] 
print(list) 

secondList = [aa, bb, cc] 

x = -1 
for item in list: 
    x=x+1 
    if list[x][1] == a: 
     print(aa, "aa") 
     secondList[x] = secondList[x] + 1 
     print(aa , "aa") 
     print(x, "x") 
     print(secondList[x], "SecondList[x]") 
     secondList = [aa, bb, cc] 
     print(secondList) 

я ожидаю:

[[1, 1], [2, 2], [3, 3]] 
0 aa 
1 aa 
0 x 
1 SecondList[x] 
[1, 0, 0] 

, но вместо этого я получаю:

[[1, 1], [2, 2], [3, 3]] 
0 aa 
0 aa 
0 x 
1 SecondList[x] 
[0, 0, 0] 

Почему значение аа не меняется, когда я напечатайте его или второй список, но когда я печатаю secondList [x]?

ответ

0

Линия

secondList = [aa, bb, cc]

копии aa, bb, cc по значение в secondList. Хотя целые числа в Python являются объектами, определяемые пользователем, из которых копируются ссылкой, это следующие типы: примитивных, поэтому для создания нового целого числа с таким же значением достаточно неглубокой копии.

Поэтому aa НЕ относится к secondList[0]. Таким образом, secondList[x] = secondList[x] + 1 НЕ обновляет aa.

EDIT: в качестве доказательства того, что я имею в виду, попробуйте следующее:

x = 1 
y = x 
x = 2 
print(y) 

Подразумевается, что вы думаете, это отпечатки «2», но вместо этого он печатает «1». Это показывает, что целые числа и все остальные примитивные типы, копируются по значению.

+0

Комментарии для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/94365/discussion-on-answer-by-willywonka-dailyblah-list-value-issue). –

1

Becuase они независимы, одна вещь - переменная aa, а другая - первый элемент вашего второго списка.

Выполнение:

secondList = [aa, bb, cc] 

не делает зависимость

1

Изменение значения первой позиции в списке «secondList» не имеет ничего общего с изменением значения переменной «аа».

При создании второго списка вы используете значения переменных aa, bb, cc в новом адресе памяти, который отличается от адресов, используемых aa, bb, cc.

0

Целые неизменны, поэтому, когда вы делаете secondList[x] + 1 вы создаете новый целочисленный объект со значением 1 и приклеить, что в списке, а не изменяя неизменность 0 хранится в aa.