Использование регулярного цикла for - самый простой способ печати массива, на мой взгляд. Здесь у вас есть пример кода, основанный на вашем intArray
for (int i = 0; i < intArray.length; i++) {
System.out.print(intArray[i] + ", ");
}
. Он дает результат как ваш 1, 2, 3, 4, 5
Переменные Python содержат ссылки на значения . Таким образом, когда вы определяете список palin
, вы передаете значение, на которое ссылается polly
, а не сама переменная.
Вы должны представлять значения как воздушные шары, при этом переменными являются потоки, привязанные к этим воздушным шарам. "alive"
- это воздушный шар, polly
- это просто поток этого воздушного шара, а в списке palin
есть другой поток, привязанный к тому же воздушному шару. В python список - это просто серия потоков, все номера которых начинаются с 0.
. Что вы делаете дальше, привяжите строку polly
к новому шару "dead"
, но список все еще держится на старую нить, привязанную к воздушному шару "alive"
.
Вы можете заменить этот поток на "alive"
, удерживаемый списком, переназначив список по индексу для обращения к каждому потоку; в вашем примере это поток 1
:
>>> palin[1] = polly
>>> palin
['parrot', 'dead']
Здесь я просто привязал поток palin[1]
к тому же, к чему polly
привязан, что бы это ни было.
Обратите внимание, что любая коллекция в python, такая как dict
, set
, tuple
и т. Д. - это просто коллекции потоков. Некоторые из них могут обмениваться потоками для разных потоков, таких как списки и dicts, и это то, что делает что-то в python «изменчивым».
С другой стороны, строки not изменяемы. Как только вы определяете строку типа "dead"
или "alive"
, это один шар. Вы можете связать его потоком (переменная, список или что-то еще), но вы не можете заменить буквы внутри него. Вы можете связать этот поток только с полной новой строкой.
Большинство вещей в python могут действовать как воздушные шары. Цели, строки, списки, функции, экземпляры, классы, все могут быть привязаны к переменной или привязаны к контейнеру.
Возможно, вы захотите прочитать трактат Ned Batchelder о именах Python .
Вы не можете. Назначение для голого имени - это Python, который всегда только восстанавливает имя, и вы не можете настроить или контролировать эту операцию.
Что вы можете сделать, это сделать polly
изменчивым объектом вместо строки и изменить его значение вместо того, чтобы переписывать имя. Простой пример:
>>> polly = ['alive']
>>> items = ['parrot', polly]
>>> items
['parrot', ['alive']]
>>> polly[0] = 'dead'
>>> items
['parrot', ['dead']]
Перед вторым заявлением печати сохраните новые значения в palin
:
palin = ["parrot", polly]
Список будет содержать только значения, а не ссылки на переменные, как вам хотелось бы. Тем не менее, вы можете сохранить лямбда в списке, а лямбда найти значение вашей переменной.
>>> a = 'a'
>>> list = ['a',lambda: a]
>>> list[1]
<function <lambda> at 0x7feff71dc500>
>>> list[1]()
'a'
>>> a = 'b'
>>> list[1]()
'b'
Когда вы помещаете строку в список, список содержит копию строки. Неважно, была ли строка первоначально переменной, литеральное значение, результат вызова функции или что-то еще; к тому времени, когда список увидит его, это всего лишь строковое значение. Изменение того, что сгенерировало строку позже, никогда не повлияет на список.
Если вы хотите сохранить ссылку на значение, которое будет замечено при изменении этого значения, обычным механизмом является использование списка, содержащего «ссылки», стоимость. Применяя это к вашему примеру, вы завершаетесь вложенным списком:
polly = ["alive"]
palin = ["parrot", polly]
print(palin)
polly[0] = "dead"
print(palin)
Другие ответы объяснили, что происходит.
Это одна из (нескольких) проблем, которые мотивируют использование объектов. Например, можно было бы это сделать:
class Animal:
def __init__(self, aniType, name):
self.aniType = aniType
self.name = name
self.isAlive = True
def kill(self):
self.isAlive = False
def getName(self):
return self.name
def getType(self):
return self.aniType
def isLiving(self):
return self.isAlive
polly = Animal("parrot", "polly")
print(polly.getName()+' the '+polly.getType()+' is alive?')
print(polly.isLiving())
polly.kill()
print(polly.getName()+' the '+polly.getType()+' is alive?')
print(polly.isLiving())
Сначала для простой задачи это может выглядеть как много кода, но объекты часто являются способами для таких вещей, потому что они помогают поддерживать все организовано.
Вот результат этой программы:
polly the parrot is alive?
True
polly the parrot is alive?
False