2015-04-23 3 views
8

Я только что обнаружил в определении переменных в Python. А именно:Python: «Цепное определение» для ints vs lists

a = b = 0 
a = 1 

дает мне a=1 и b=0 или б две независимые переменные.

Но:

a = b = [] 
a.append(0) 

дает мне a = [0] и b = [0], или а и Ъ две ссылки на тот же объект. Это меня смущает, как эти два случая различны? Это потому, что int являются примитивными типами или потому, что списки - это просто указатели?

+1

2 операции различны. В первом случае вы назначаете новое значение a, а во втором - изменяете объект, на который указывает ... –

+4

Тестирование несовместимо. Попробуйте 'a = b = []; a = [1, 2, 3] ' – thefourtheye

+1

Релевантное видео: [Факты и мифы о именах и значениях Python] (https://www.youtube.com/watch?v=_AEJHKGk9ns) –

ответ

13

a и b указание на одинаковый объект всегда. Но вы не можете изменить целое число, оно неизменно.

В вашем первом примере вы отскокa, чтобы указать на другой объект. Вы не делали этого в другом примере, вы никогда не назначали другой объект a.

Вместо этого вы задали объект aссылки, чтобы изменить себя, чтобы добавить еще одну запись к этому объекту. Все остальные ссылки на тот же объект (list) будут видеть эти изменения. Это потому, что объекты list изменяемы.

Правильное сравнение было бы повторно назначить a, чтобы указать на новый объект списка:

a = b = [] 
a = [0] 

Теперь вы отскок a и b по-прежнему ссылается на первый объект списка.

1

Вы должны понимать, что a и b просто ссылки, которые указывают на первоначально пустой список:

>>> a = [] # set variable a to an empty list 
>>> b = a # sets b to what a is pointing to 
>>> a.append(0) # add a zero to the original 

# Step 1: A --> [ ] 
# Step 2: A --> [ ] <-- B 
# Step 3: A --> [0] <-- B