Почему оператор печати Python 3, кажется, изменяет переменную, объявленную позже в коде, но прекрасно работает без нее? - PullRequest
0 голосов
/ 16 октября 2018

Я использую Python 3.6.2 в Windows 10 и изучал функцию zip ().

Я хотел напечатать часть объекта, возвращенную функцией zip ().

Вот мой код без оператора печати:

a = ("John", "Charles", "Mike")

b = ("Jenny", "Christy", "Monica", "Vicky")

x = zip(a, b)

tup = tuple(x)

print(tup)

print(type(tup))

print(len(tup))

print(tup[1])

Вот мой код с оператором печати:

a = ("John", "Charles", "Mike")

b = ("Jenny", "Christy", "Monica", "Vicky")

x = zip(a, b)

print(tuple(x)[1])

tup = tuple(x)

print(tup)

print(type(tup))

print(len(tup))

print(tup[1])

Печать (tuple (x) [1]), по-видимому, изменяет кортеж 'tup' на единицу нулевой длины и приводит к сбою печати (tup [1]) позже в коде!

1 Ответ

0 голосов
/ 16 октября 2018

В этой строке вы создаете итератор:

x = zip(a, b)

Внутри оператора print вы конвертируете итератор в кортеж.Этот кортеж состоит из 3 элементов.Это исчерпывает итератор, и каждый раз, когда вы вызываете его позже, он не возвращает никаких дополнительных элементов.

Следовательно, после создания tup ваш итератор не возвращает элемент.Следовательно, у вас есть кортеж с длиной 0. И, конечно, это вызовет исключение, когда вы попытаетесь получить доступ к элементу с индексом 1.

Для тестирования рассмотрите следующее:

a = ("John", "Charles", "Mike")

b = ("Jenny", "Christy", "Monica", "Vicky")

x = zip(a, b)

tup1 = tuple(x)
tup2 = tuple(x)

print(tup1)
print(tup2)

Это даст вам следующий результат:

(('John', 'Jenny'), ('Charles', 'Christy'), ('Mike', 'Monica'))
()

Это в основном то, что вы делаете, когда дважды создаете кортеж из итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...