【问题标题】:Is there equivalent Python 3 code for this C swap macro?这个 C 交换宏是否有等效的 Python 3 代码?
【发布时间】:2020-07-16 23:52:21
【问题描述】:

这是我在 C 中使用的代码。它似乎是一个简单的变量交换。

#define ELEM_SWAP(a,b) { register double t=(a);(a)=(b);(b)=t; }

但我看到它是这样称呼的

ELEM_SWAP(array[x], array[y]). 

我正在尝试使用 numpy 数组在 Python 3 中模拟此宏。我最接近的等价物是这个函数,但似乎 C 代码交换变量,而 Python 交换列表中的项目。

def elem_swap(mylist, x, y):
    mylist[x], mylist[y] = mylist[y], mylist[x]
    return mylist

【问题讨论】:

  • 您能否为 elem_swap 添加示例输入以及预期输出和实际输出?
  • C 代码似乎交换了变量 array[x], array[y] 变量如何?它们不也是C中的数组元素吗?
  • 交换数组可能不同于交换列表。根据数组形状,索引项可能是视图这一事实可能会导致意外结果。使用数组列表索引可能会更好:arr[[i,j] = arr[[j, i]],
  • @steviestickman 如果给定数组 [1,2,3],传递 elem_swap(array[0], array[2]) 应该使它成为 [3,2,1],或者至少是我相信它在做什么。这是我正在查看的遗留代码,这是我假设它在我看到它的使用方式的上下文中所做的事情。
  • stackoverflow.com/questions/14836228/… 会回答您的问题吗? Python 没有宏,你永远不会使用函数来交换变量,因为你可以直接在代码中进行,而且函数调用只会干扰技术。

标签: python c python-3.x numpy


【解决方案1】:

C #define 是一个文本处理指令。它只是替换文本

所以,这段代码:

ELEM_SWAP(array[x], array[y]) 

被这个替换:

{ register double t=(array[x]);(array[x])=(array[y]);(array[y])=t; }

这将交换变量内容。如果你尝试过类似ELEM_SWAP(1, 1) 的方法,它会失败。

没有办法在具有全部功能的 Python 代码中翻译此宏。但是如果我们需要一个类似的列表;那么你的功能就足够好了。除了我会删除 return 部分,除非你真的需要它((请记住,你返回的是同一个列表,而不是它的副本))

def elem_swap(mylist, x, y):
    mylist[x], mylist[y] = mylist[y], mylist[x]

这将被用作:

lst = [1.0, 2.3, 4.6, 3.9]
elem_swap(lst, 1, 2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多