Python 为什么';我的函数不能交换变量交换变量吗?

Python 为什么';我的函数不能交换变量交换变量吗?,python,function,python-2.7,Python,Function,Python 2.7,首先,我有这个功能: def change_pos(a, b): temp = a a = b b = temp print 'Done' a, b = b, a 我在另一个函数中调用它,但它只打印'Done'而不执行任何操作。 我直接编写代码: a = 1 b = 2 temp = a a = b b = temp 它很好用。有什么建议吗? 第二,这是我的代码 def check_exception(list): for element in list:

首先,我有这个功能:

def change_pos(a, b):
  temp = a
  a = b
  b = temp
  print 'Done'
a, b = b, a
我在另一个函数中调用它,但它只打印'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
def check_异常(列表):
对于列表中的元素:
#以数字列表为例
#\s*:是否跳过空格(\t\n\r\f\v),\d:Number[0-9]
#?:常规括号的非捕获版本
first=re.compile(“\s*(?:\[)(\d+)\s*(?:,)”).findall(元素)
last=re.compile(“\s*(?:,)(\d+)\s*(?:\])”).findall(元素)
#将字符串转换为整数
first_int=map(int,first)
last_int=map(int,last)
#检查并编码上述工作
i=0
打印首字母[i]
更改位置(首字母[i],首字母[i+1])
打印首字母[i+1]
打印长度(第一次打印)
#打印类型(第一次打印[0])
#分类
#错误:第47行和更多行的列表索引超出范围
i=0
而ifirst_int[i+1]:
更改位置(首字母[i],首字母[i+1])
更改位置(最后一个整数[i],最后一个整数[i+1])
i+=1
#检查异常
j=0
当j
我看到:IndexError:list index在#Error之后的条件下超出范围
谢谢你的帮助。:)

您的
change\u pos
函数没有任何用处,因为它只交换函数内部的变量,而不是用来调用函数的变量。实现您想要的一种方法是:

def change_pos(a, b):
    print 'DONE'
    return b, a
然后使用它就变成:

a, b = change_pos(a,b)
甚至没有功能:

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

其次,我相信您可以自己找出为什么会出现索引错误。但这就是为什么。数组是零索引的,并且在while循环中使用
last\u int
的长度。现在想象一下
last_int
的长度为5。这意味着它的索引值在0-4之间。在循环的最后一次迭代中,您试图访问if语句(
last\u int[j+1]
)中的
last\u int[5]
,这当然会给您一个索引错误。

您可能被告知变量是内存中包含数据的位置。对于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
def change_pos(lst, p):
    lst[p], lst[p+1] = lst[p+1], lst[p]
这给了你一个提示,有一个更简单的方法,确实有。您可以这样做:

a = 1
b = 2
a, b = b, a
所以根本不需要函数

由于您实际上希望交换列表中的整数,因此可以创建如下函数:

def change_pos(a, b):
    return b, a
def change_pos(lst, p):
    lst[p], lst[p+1] = lst[p+1], lst[p]
但我认为这并没有显著增加代码的可读性


此外,您对它的使用以注释
#sort
作为前缀。但是您的代码没有排序。这有点像半途而废的冒泡排序,但我不知道您为什么要这样做。

在python中,数字是不可变的。当你把它们传递给函数时,函数会处理变量的副本。如果您尝试使用列表之类的可变类型,这可能会很棘手。但是python用一些简洁的语法技巧覆盖了这个函数

   a, b = b, a

这将交换两个变量,而不需要任何附加函数。

如果Python使用传递值,那么它传递的值就是一个引用。这意味着它通过引用传递。;-)事实上,这种区别在Python中根本没有意义。@LennartRegebro是的,这是真的。Java也有类似的奇怪情况。@DuongVu:将第二个问题作为一个单独的问题。@btse这仍然是不正确的,它只是传递引用。禁止复制。这与传递无关,问题在于名称绑定。名称是本地的。@LennartRegebro“传递值,其中值是引用”有时称为“传递共享”,以限制混淆。在Python中,数字是不可变的。但这与这个问题完全无关,这很公平。我想让OP知道,更复杂的函数可能会更改可变类型,但不会更改不变类型。因此,没有函数可以直接交换两个数字,而如果他在列表中传递它们,他可以修改列表并获得一个函数。但正如你所指出的,不是他问的问题,我也没有真正解释我的意思。对于第二个问题,我建议你开始一个新的问题。你不应该在一个问题中问两个问题。这阻止我给你+1。哦,天哪,你接受了一个错误的答案。好的,我修正了它,所以现在它是正确的。还是。欢迎使用SO,但如果您按预期使用该网站,您可能会做得更好。阅读顶部“帮助”下的常见问题等。作为旁注,在Python中,交换两个变量不需要临时变量;只需执行
a,b=b,a
。是的,但我在一些复杂变量中多次使用它,所以我想编写一个函数使代码可读:)谢谢,是的,那
first_int[I],first_int[I+1]=first_int[I+1],first_int[I]
呢?我认为这不是很好,但我会尽量做一些像你这样容易的事way@DuongVu:对于列表,这是一个完全不同的问题,但是你需要传入列表,而不是整数。@DuongVu此外,你知道Python有一个内置的复杂类型,对吧?@LennartRebebro:事实上,我不知道。我只是一个新手,做功课来理解Python。