Идиома Python для этого - newList = oldList[:]
CPython - это сбор мусора, как только они выходят из области видимости, поэтому второй []
создается после сбора первого []
. Таким образом, большую часть времени он попадает в ту же ячейку памяти.
Это показывает, что происходит очень четко (выход может отличаться в других реализациях Python):
class A(object):
def __init__(self): print "a",
def __del__(self): print "b",
# a a b b False
print A() is A()
# a b a b True
print id(A()) == id(A())
Оператор == на списках и dicts не сравнивает идентификаторы объектов, чтобы увидеть, являются ли они одним и тем же объектом. Для этого используйте obj1 is obj2
.
Вместо этого оператор == сравнивает членов списка из dict, чтобы узнать, совпадают ли они.
id()
.
– Thomas Wouters
6 October 2010 в 23:09
is
, прежде чем выполнять проверку члена. Причина, заключающаяся в том, что два объекта с одним и тем же идентификатором должны иметь одинаковый контент. Но вы правы, что сравнение id()
должно выполняться с использованием оператора is
вместо id(a) == id(b)
; и что принятие id () объекта обычно бессмысленно.
– Lie Ryan
6 October 2010 в 23:16
[] is []
- False
. Я предполагаю, что передача первого []
в id
создает область для его выхода.
– aaronasterling
6 October 2010 в 23:53
он не работает одинаково в Jython ...
>>> id({})
1
>>> id([])
2
Может ли быть оптимизация, когда обычно используемые (т.е. пустые) контейнеры «интернированы», чтобы сэкономить на расходах на размещение ?
Это (в CPython) не предполагает:
>>> def mutateid(obj):
... obj.append('x')
... print obj
... print id(obj)
...
>>> mutateid([])
['x']
4299590472
>>> id([])
4299590472
>>>
id()
. Насколько я помню, Jython использует счетчик, который начинает отсчет, когда вы вызываете id()
на объект.
– Thomas Wouters
6 October 2010 в 23:11
id({}) == id({})
в Jython?
– Marcelo Cantos
6 October 2010 в 23:12
Когда вы вызываете id({})
, Python создает dict и передает его функции id
. Функция id
принимает свой идентификатор (ячейку памяти) и отбрасывает dict. Дик разрушен. Когда вы делаете это дважды в быстрой последовательности (без каких-либо других dicts, создаваемых в среднее время), dict Python создает второй раз, когда используется тот же блок памяти, что и в первый раз. (Распределитель памяти CPython делает это намного более вероятным, чем кажется). Поскольку (в CPython) id
использует память в качестве идентификатора объекта, идентификатор двух объектов одинаковый. Это, очевидно, не происходит, если вы назначаете dict переменной и затем получаете ее id()
, потому что dicts живы одновременно , поэтому их id
должны быть разными.
Мутируемость не вступает в игру, а кеширует кеширование кортежей и строк. В том же объекте кода (функция или тело тела тела или тела модуля) будут повторно использоваться те же литералы (целые числа, строки и некоторые кортежи). Mutable objects никогда не могут быть повторно использованы, они всегда создаются во время выполнения.
Короче говоря, идентификатор объекта уникален только для времени жизни объекта . После уничтожения объекта или до его создания что-то еще может иметь один и тот же идентификатор.
some_constant * log(upvoter_rep) / log(answerer_rep)
– John Machin
7 October 2010 в 00:38
print id({}); a = []; print id({})
дважды печатает одно и то же значение в cpython? Должен ли этот список, хранящийся вa
, занимать место, освобожденное первым dict? – Laurence Gonsalves 2 November 2010 в 22:52Objects/listobject.c
иdictobject.c
). – abarnert 27 May 2015 в 04:11x = []; i = id(x); del x; gc.collect(); i == id([])
. Если вы отпустите вызовgc.collect()
, это (скорее всего) вернетFalse
, в противном случае (вероятно)True
. – filmor 9 December 2015 в 11:48