2009-09-04 3 views
172

Я изучаю Python и создаю соединение с базой данных. При попытке добавить к БД я собираюсь создать кортежи из информации, а затем добавить их в БД.Добавить переменные в кортеж

Что я делаю: Я беру информацию от пользователя и сохраняю ее в переменных. Могу ли я добавить эти переменные в кортеж? Не могли бы вы помочь мне с синтаксисом?

Кроме того, если есть эффективный способ сделать это, пожалуйста, поделитесь ...

EDIT Позвольте мне изменить этот вопрос немного ... Мне нужно только кортеж для ввода информации в БД. Как только информация будет добавлена ​​в БД, я должен удалить кортеж? Я имею в виду, что мне больше не нужен кортеж.

ответ

225

Кортежи неизменяемы; вы не можете изменить, какие переменные они содержат после построения. Тем не менее, вы можете сцепить или нарезать их, чтобы сформировать новые кортежи:

a = (1, 2, 3) 
b = a + (4, 5, 6) 
c = b[1:] 

И, конечно, строить их из существующих значений:

name = "Joe" 
    age = 40 
    location = "New York" 
    joe = (name, age, location) 
+0

Мне нужны только эти кортежи для добавления в db после ввода пользователем. так что я должен уничтожить эти кортежи после завершения обновления до db? – amit

+5

Вам не нужно уничтожать кортежи после обновления db. Если они выходят из сферы действия, они должны собирать мусор. –

+0

Чтобы добавить строку в кортеж, не нарушив собственно строку, проверьте https://stackoverflow.com/a/16449189 –

7

Это так же легко, как:

info_1 = "one piece of info" 
info_2 = "another piece" 
vars = (info_1, info_2) 
# 'vars' is now a tuple with the values ("info_1", "info_2") 

Однако кортежей в Python являются неизменны, так что вы не можете добавлять переменные в кортеж, когда он будет создан.

1

Я уверен, что синтаксис для этого в питона:

user_input1 = raw_input("Enter Name: ") 
user_input2 = raw_input("Enter Value: ") 
info = (user_input1, user_input2) 

один раз множества, кортежи не могут быть изменены.

2

Как отметили другие ответы, вы не можете изменить существующий кортеж , но вы всегда можете создать новый кортеж (который может принимать некоторые или все элементы из существующих кортежей и/или других источников).

Например, если все вопросы, представляющие интерес в скалярных переменных, и вы знаете имена этих переменных:

def maketuple(variables, names): 
    return tuple(variables[n] for n in names) 

, которые будут использоваться, например, как в этом примере:

def example(): 
    x = 23 
    y = 45 
    z = 67 
    return maketuple(vars(), 'x y z'.split()) 

, конечно, этот случай был бы более просто выражен как (x, y, z) (или даже вообще отказался от имен, (23, 45, 67)), но подход maketuple мог бы быть полезен в некоторых более сложных случаях (например, когда имена, используемые для использования, также определяются dyna и добавляется к списку во время вычисления).

3

«Как только информация добавляется в БД, я должен удалить кортеж? Я имею в виду, что мне больше не нужен кортеж».

No.

В общем, нет никаких причин, чтобы удалить что-нибудь. Есть некоторые специальные случаи для удаления, но они очень, очень редки.

Просто определите узкую область (то есть определение функции или функцию метода в классе), и объекты будут мусором, собранным в конце области.

Не волнуйтесь ни о чем.

[примечание. Я работал с парнем, который - в дополнение к попытке удалить объекты - всегда писал методы «сброса», чтобы очистить их. Как будто он собирался спасти их и использовать их повторно. Также глупое тщеславие. Просто игнорируйте объекты, которые вы больше не используете. Если вы определяете свои функции в блоках с малым количеством кода, вам больше не о чем подумать.]

161

Вы можете начать с пустого кортежа с чем-то вроде t =(). Вы можете добавить +, но вы должны добавить еще один кортеж. Если вы хотите добавить один элемент, сделайте его одиночным: t = t + (element,). Вы можете добавить кортеж из нескольких элементов с этой запятой или без нее.

>>> t =() 
>>> t = t + (1,) 
>>> t 
(1,) 
>>> t = t + (2,) 
>>> t 
(1, 2) 
>>> t = t + (3, 4, 5) 
>>> t 
(1, 2, 3, 4, 5) 
>>> t = t + (6, 7, 8,) 
>>> t 
(1, 2, 3, 4, 5, 6, 7, 8) 
+11

В этом примере можно также: 't =()' then 't + = (1,) ' –

29

Другая тактика еще не упоминается использует добавление в список, а затем преобразование списка в кортеж в конце:

mylist = [] 
for x in range(5): 
    mylist.append(x) 
mytuple = tuple(mylist) 
print mytuple 

возвращает

(0, 1, 2, 3, 4) 

Я иногда использую это когда мне нужно передать кортеж в качестве аргумента функции, что часто необходимо для функций numpy.

+1

Полезно знать, что работает обратное, т. Е.' List (someTuple) '. Два типа объектов, по-видимому, взаимозаменяемы. – khaverim

+0

Не совсем взаимозаменяемый. Я думаю, что преобразование из кортежа в список будет копировать все элементы в списке, поэтому есть определенно место, чтобы его избежать – gbtimmon

Смежные вопросы