2013-10-06 2 views
0

Во-первых, у меня есть эта функция:Почему моя функция не меняет переменные переменных?

def change_pos(a, b): 
    temp = a 
    a = b 
    b = temp 
    print 'Done' 

И я называю это в другой функции, но это просто напечатать «Done» и ничего не делать. Я пишу код непосредственно:

a = 1 
b = 2 
temp = a 
a = b 
b = temp 

Он отлично работает. Любое предложение здесь? Во-вторых, это мой код

def check_exception(list): 
    for element in list: 
    # Take list of numbers 
    # \s*: Skip space or not (\t\n\r\f\v), \d: Number [0-9] 
    # ?: Non-capturing version of regular parentheses 
     first = re.compile("\s*(?:\[)(\d+)\s*(?:,)").findall(element) 
     last = re.compile("\s*(?:,)(\d+)\s*(?:\])").findall(element) 
    # Convert string to integer 
     first_int = map(int, first) 
     last_int = map(int, last) 

    # Check and code above works 
     i = 0 
     print first_int[i] 
     change_pos(first_int[i],first_int[i+1]) 
     print first_int[i+1] 
     print len(first_int) 
     #print type(first_int[0]) 
    # Sort 
     # Error: list index out of range at line 47 and more 
     i = 0 
     while i < len(first_int): 
      if first_int[i] > first_int[i+1]: 
       change_pos(first_int[i], first_int[i+1]) 
       change_pos(last_int[i], last_int[i+1]) 
      i += 1 
    # Check exception 
     j = 0 
     while j < len(last_int): 
      if last_int[j] < first_int[j+1]: 
       return false 
       break 
      else: 
       j += 1 
       continue 
      return true 

И я вижу: IndexError: список индексов вне диапазона в условиях после # Ошибка Спасибо за любую помощь. :)

+0

Для второго выпуска, я предлагаю вам задать новый вопрос. Вы не должны задавать два вопроса в одном вопросе здесь. Это мешает мне дать вам +1. –

+0

О, дорогая, и вы приняли неправильный ответ. –

+0

ОК, я исправил его, так что теперь это правильно. Все еще. Добро пожаловать в SO, но вы, вероятно, сделаете лучше, если вы используете сайт по своему усмотрению. Читайте FAQ и т. Д. В разделе «Справка» сверху. –

ответ

3

Функция change_pos не делает ничего полезного, поскольку она меняет только переменные внутри функции, а не переменные, которые использовались для вызова функции. Один из способов достижения того, что вы хотите, это:

def change_pos(a, b): 
    print 'DONE' 
    return b, a 

, а затем использовать его становится:

a, b = change_pos(a,b) 

Или даже без функции:

a, b = b, a 

Во-вторых, я уверен, что вы может понять, почему вы получаете ошибку индекса самостоятельно. Но вот почему так или иначе. Массивы нулевые индексируются, и вы используете длину last_int в вашем цикле while. Теперь представьте, что last_int имеет длину 5. Это означает, что он имеет значения индекса от 0 до 4. В последней итерации цикла вы пытаетесь получить доступ к last_int[5] в вашем операторе if (last_int[j+1]), который, конечно же, даст вам ошибку индекса.

+0

Если Python использует pass по значению, то переданное значение является ссылкой. Это означает, что он проходит по ссылке. ;-) На самом деле различие просто не имеет смысла в Python. –

+0

@ LennartRegebro Да, это правда. Такая же странная ситуация с Java. – btse

+0

Это работает. Спасибо. Любая идея для второго вопроса? – DuongVu

1

Возможно, вам сказали, что переменные являются местоположениями в памяти с данными в нем. Это не относится к Python. Переменные - это просто имена, указывающие на объекты.

Следовательно, вы не можете в Python записывать функцию, такую ​​как функция change_pos, которую вы пытаетесь записать, потому что имена, которые вы изменяете, будут именами, используемыми в функции, а не именами, которые используются при вызове.

Вместо этого:

a = 1 
b = 2 
change_pos(a, b) 

Вы должны будете сделать это:

a = 1 
b = 2 
a, b = change_pos(a, b) 

функция должна выглядеть следующим образом:

def change_pos(a, b): 
    return b, a 

Это даст вам подсказку, что есть более простой способ, и действительно есть. Вы можете сделать это:

a = 1 
b = 2 
a, b = b, a 

Так что нет необходимости в какой-либо функции.

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

def change_pos(lst, p): 
    lst[p], lst[p+1] = lst[p+1], lst[p] 

Но я не думаю, что значительно добавляет читаемости кода.

Также ваше использование этого с префиксом #sort. Но ваш код не сортирует. Это немного похоже на полуподобный пузырь, но я не знаю, почему вы хотели бы это сделать.

+0

Да, но я использую его много раз с некоторыми сложными переменными, поэтому я хочу написать функцию, чтобы сделать мой код доступным для чтения :) Спасибо – DuongVu

+0

@DuongVu: 'a, b = b, a' читается. –

+0

Да, как насчет 'first_int [i], first_int [i + 1] = first_int [i + 1], first_int [i]'? Я думаю, что это не очень хорошо, но я постараюсь сделать так легко, как ваш путь. – DuongVu

-2

Номера неизменны в python. Когда вы передаете их функции, функция работает с копиями переменных. Это может быть сложно, если вы попробуете это с изменяемыми типами, например списками. Но у python эта функция покрыта некоторыми опрятными синтаксическими трюками.

a, b = b, a 

Это своп двух переменных без каких-либо дополнительных функций.

+0

Это не проблема – TerryA

+2

Номера * * неизменяемы в Python. Но это совершенно не имеет значения для этого вопроса. –

+0

Достаточно честный. Я хотел, чтобы OP знал, что более сложные функции могут изменять изменяемые типы, но не неизменные типы. Таким образом, никакая функция не может заменять сразу два числа, тогда как если бы он передал их в списке, он мог бы изменить список и получить функциональную работу. Но, как вы указали, на самом деле он не спросил, и я действительно не объяснил, что я имел в виду. – Kevin

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