为什么我的函数不交换变量交换变量?

时间:2013-10-06 06:32:30

标签: python function python-2.7

首先,我有这个功能:

def change_pos(a, b):
  temp = a
  a = b
  b = temp
  print '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:在#Error 之后的条件下列出索引超出范围 谢谢你的帮助。 :)

3 个答案:

答案 0 :(得分:3)

您的change_pos函数没有任何用处,因为它只交换函数内部的变量,而不是用于调用函数的变量。实现你想要的东西的一种方法是:

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

然后使用它变成:

a, b = change_pos(a,b)

甚至没有功能:

a, b = b, a

其次,我相信你可以弄清楚为什么你自己会得到一个索引错误。但无论如何,这就是为什么。数组为零索引,并且您在while循环中使用last_int的长度。现在假设last_int的长度为5.这意味着它的索引值范围为0-4。在循环的最后一次迭代中,您试图在if语句(last_int[5])中访问last_int[j+1],这当然会给您一个索引错误。

答案 1 :(得分: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。但是你的代码没有排序。这有点像一个半假的泡泡排序,但我不知道你为什么要那样做。

答案 2 :(得分:-2)

数字在python中是不可变的。当你将它们传递给函数时,该函数可以使用变量的副本。如果你尝试使用像Lists这样的可变类型,这可能会很棘手。但是python的这个功能覆盖了一些巧妙的语法技巧。

   a, b = b, a

这可以交换两个变量,而不需要任何其他功能。