звезда распаковать и переупаковать кортеж python 2 [дублировать]

Java всегда проходит по значению, без каких-либо исключений, когда-либо.

Итак, как же все могут быть смущены этим и считают, что Java проходит по ссылке или думает, что они пример Java, действующий как пропуск по ссылке? Ключевым моментом является то, что Java никогда не обеспечивает прямой доступ к значениям самих объектов , в любых обстоятельствах. Единственный доступ к объектам через ссылку к этому объекту. Поскольку объекты Java всегда всегда доступны через ссылку, а не напрямую, обычно говорят о полях и переменных и аргументах метода как объекты , когда педантично они являются только ссылками на объекты . Путаница проистекает из этого (строго говоря, неправильного) изменения в номенклатуре.

Итак, при вызове метода

  • Для примитивных аргументов (int, long, и т. д.), пропуск по значению - фактическое значение примитива (например, 3).
  • Для объектов пропускным значением является значение ссылка на объект .

Итак, если у вас есть doSomething(foo) и public void doSomething(Foo foo) { .. }, два Foos скопировали ссылки , которые указывают на тот же объектов.

Естественно, что передача по значению ссылки на объект очень похожа на (и на практике неотличима от), передавая объект по ссылке.

29
задан Community 23 May 2017 в 10:31
поделиться

2 ответа

в 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
28
ответ дан martineau 15 August 2018 в 17:13
поделиться
  • 1
    Только если c является последовательностью. Распаковка работает с любым итерабельным, поэтому для полного решения сначала сделайте c = tuple(c). Это точно эмулирует поведение, включая зависание на бесконечных итерациях. Но вам еще нужно усердно работать a, *b, c = range(10); но нет никакого реального пути вокруг этого. – lvc 29 May 2012 в 05:28
  • 2
    @lvc хорошая точка. Я отредактировал свой ответ. – Andbdrew 29 May 2012 в 05:33
  • 3
    @lvc man, что a, *b, c = range(10) довольно круто! – Andbdrew 2 June 2012 в 17:36
  • 4
    print ImageFileList iflt = tuple (ImageFileList) для x, y в iflt [0], iflt [1:]: почему я все еще получаю сообщение об ошибке? ValueError: слишком много значений для распаковки ImageFileList - это всего лишь список имен файлов – Aymon Fournier 29 June 2016 в 02:36
(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.

2
ответ дан Ben 15 August 2018 в 17:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: