2016-09-07 3 views
4

Я немного запутался о том, как питон сделки со ссылкой на элемент в списке, принимая во внимание эти два примера:Ссылка на элемент в списке

Первый пример:

import random 
a = [[1,2],[3,4],[5,6],[7,8]] 
b = [0.1,0.2] 
c = random.choice(a) 
c[:] = b 
print(a) 

Второй пример:

import random 
a = [1, 2, 3, 4, 5, 6, 7, 8] 
b = 0.1 
c = random.choice(a) 
c = b 
print(a) 

В первом примере содержимое в списке a изменяется; в то время как во втором примере содержимое списка a не изменяется. Почему это?

ответ

3

Начнем со второго случая. Вы пишете

c = random.choice(a) 

поэтому имя c получает привязан к некоторому элементу а, то

c = b 

поэтому имя c получает связанный с какой-то другой объект (тот, к которому имя b имеет в виду - поплавок 0.1).


Теперь к первому случаю. Вы начинаете с

c = random.choice(a) 

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

c[:] = b 

значит, заменить все элементы в списке, связанный с именем c, по какому-то другому списку. На самом деле это называется slice assignment и в основном является синтаксическим сахаром для вызова метода объекта, к которому привязан c.


Разница, то, что в первом случае, это не просто привязать имя первого к одному объекту, а затем в другую. Он связывает имя с списком, затем использует это имя для косвенного вызова метода списка.

+0

Есть ли способ изменить значение списка 'a' во втором примере? –

+1

Конечно, если вы делаете 'i = random.choice (список (диапазон (len (a))), то вы получите индекс. Тогда' a [i] = ... 'будет изменять его. –

Смежные вопросы