Java всегда проходит по значению, без каких-либо исключений, когда-либо.
Итак, как же все могут быть смущены этим и считают, что Java проходит по ссылке или думает, что они пример Java, действующий как пропуск по ссылке? Ключевым моментом является то, что Java никогда не обеспечивает прямой доступ к значениям самих объектов , в любых обстоятельствах. Единственный доступ к объектам через ссылку к этому объекту. Поскольку объекты Java всегда всегда доступны через ссылку, а не напрямую, обычно говорят о полях и переменных и аргументах метода как объекты , когда педантично они являются только ссылками на объекты . Путаница проистекает из этого (строго говоря, неправильного) изменения в номенклатуре.
Итак, при вызове метода
int
, long
, и т. д.), пропуск по значению - фактическое значение примитива (например, 3). Итак, если у вас есть doSomething(foo)
и public void doSomething(Foo foo) { .. }
, два Foos скопировали ссылки , которые указывают на тот же объектов.
Естественно, что передача по значению ссылки на объект очень похожа на (и на практике неотличима от), передавая объект по ссылке.
в python 2.X вы можете сделать:
c = (1, 2, 3)
a, b = c[0], c[1:]
, если c
имеет хотя бы один член, он будет работать, потому что если c
имеет только 1 вещь c[1:]
] []
.
Возможно, вы должны убедиться, что в c
есть хотя бы одна вещь, иначе c[0]
вызовет исключение.
Вы могли бы сделать что-то вроде:
try:
c = tuple(c)
a, b = c[0], c[1:]
except TypeError, IndexError:
# c is not iterable, or c is iterable, but it doesn't have any stuff in it.
# do something else
pass
(a,b) = (None, []) if not len(c) else (c[0], c[1:])
также является опцией для обработки случая, когда c - пустая последовательность, хотя она не будет различать [None] и [] в терминах как присвоения a, b. Так что используйте его с осторожностью, try / except, вероятно, лучше всего.
Я не вижу никакой реальной разницы между Python 3 и 2.7 при обработке пустого контейнера, но хорошая вещь о Python 3 здесь работает с любой итеративный.
Это работает в версии 2.7, если вы знаете, что c является генератором.
a,b = c.next(), c
Но полная красота распаковки, по-видимому, требует Python 3.
c
является последовательностью. Распаковка работает с любым итерабельным, поэтому для полного решения сначала сделайтеc = tuple(c)
. Это точно эмулирует поведение, включая зависание на бесконечных итерациях. Но вам еще нужно усердно работатьa, *b, c = range(10)
; но нет никакого реального пути вокруг этого. – lvc 29 May 2012 в 05:28a, *b, c = range(10)
довольно круто! – Andbdrew 2 June 2012 в 17:36