【问题标题】:How do you swap two local variables within a function in python [duplicate]如何在python中的函数中交换两个局部变量[重复]
【发布时间】:2019-01-18 00:10:36
【问题描述】:

我正在尝试在函数中交换局部变量以将 2 x 2 矩阵旋转 90 度。

def twobytwo(m):
    last = len(m)-1
    for i in range(0, last):
        swap(m[i][i], m[i][last])
        swap(m[i][i], m[last][last])
        swap(m[i][i], m[last][i])
    return m


def swap(i, j):
    temp = i
    i = j
    j = temp

print(twobytwo([[0, 1], [2, 3]]))

目前,我返回了原始矩阵,但我想查看

[[2,0],[3,1]]

【问题讨论】:

  • swap 不会更改 twobytwo 中的任何内容,因为 int 是不可变的。
  • @Tomothy32:即使整数是可变的,或者如果您传入列表而不是整数,它也不会改变任何内容。局部变量赋值不会改变对象。
  • 关于如何解决此问题的任何建议?

标签: python arrays matrix data-structures


【解决方案1】:

我认为这是您想要实现的目标:

def twobytwo(m):
    last = len(m)-1
    for i in range(0, last):
        m[i][i], m[i][last] = m[i][last], m[i][i]
        m[i][i], m[last][last] = m[last][last], m[i][i]
        m[i][i], m[last][i] = m[last][i], m[i][i]
    return m

print(twobytwo([[0, 1], [2, 3]]))

编辑: 如果你还想维护swap的功能:

def swap(i, j):
    return j, i

a, b = swap(a, b)

但我认为a, b = b, a 已经足够好了。

【讨论】:

  • 非常感谢!如果我也想使用交换功能,您是否偶然知道该怎么做?
  • @user9476376 在上面添加了其他答案。
【解决方案2】:

您的假设是 swap() 参数已就地修改(即按引用传递)。 Python 在您的代码中不会这样做:当您调用类似 swap(m[i][i], m[i][last]) 的东西时,它会取消引用 m 的值并调用 swap(0,1)。所以 swap() 只修改 i,j;它不会修改您的“矩阵”(从技术上讲,它是一个列表列表)。

尝试重写您的 swap() 函数以获取“矩阵”加上两对索引:(i,j) 和 (k,l)。

【讨论】:

  • Python 也不使用“按值传递”。见stackoverflow.com/questions/986006/…
  • @mkrieger1 :如果您传递一个像 m 这样的对象,那将是正确的,但示例代码取消引用 int 值,这些值不是对象。尽管如此,我还是更新了答案以澄清这一点。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多