【问题标题】:Trouble understanding pass by reference麻烦理解pass by reference
【发布时间】:2015-10-22 02:46:11
【问题描述】:

我发现理解 c# 中的引用传递真的很令人困惑。在我的代码中,我有一个带有两个参数的函数

private bool SerialUnEscape(byte serialData, ref byte serialResult)
    {
        if (((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_START) ||
                     ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_END)) {
            serialEscaped = false;
            serialResult = 0;
            return (true);
            }

        } else if (serialEscaped) {

            if ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_ESCAPE_START) {
                serialResult = (int)SerialProcessValue.SERIAL_PACKET_START;
                serialEscaped = false;
                return (true);
            } 
        } else {
            serialResult = serialData;
            return (true);
        }

    }

我正在调用函数,引用为 serialDataLsbserialDataMsb

现在我的困惑是,serialDataLsbserialDataMsb 的值是多少, 是否得到serialResult 的值??

  for (i = 0; i < serialElements; i++) {
    serialDataLsb = 0;
    serialDataMsb = 0;
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataLsb)) {
            break;
                }
               }
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataMsb)) {
            break;
            }
        }
serialElementData[i] = (UInt16)(serialDataLsb + (serialDataMsb << 8));
}

我需要将此代码移植到 python 中,1) 我如何在 python 中实现通过引用传递

我试过用这个

while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break
while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break

【问题讨论】:

  • C != C# .. 下次请正确标记问题
  • 如果您不需要将值传递给函数,请考虑改用out keyword
  • 在我看来,这段代码更多地是关于 Python 而不是 C#。我建议你只从 Python 返回一个元组...
  • 但是如何在 python 中获取 serialDataLsb 或 serialDataMsb 的值

标签: c# python pass-by-reference


【解决方案1】:

如果您真的想模仿传递引用而不是更改代码以返回值,您可以将要更改的原语包装在一个对象中。为简单起见,我使用了一个列表:

def change_reference(byteContainer):
    byteContainer[0] = 42

b = 123
print(b) # Prints 123

# Copy the data into the container list.
container = [b]
# Pass a pointer to that list into the function.
change_reference(container)
# Take the value out of the container.
b = container[0]

print(b) # Prints 42

这让你的功能真的很混乱。你真正应该做的是在返回值中包含修改后的字节:

def test_and_subtract(v):
    if v == 1:
        return (v - 1, True)
    return (v - 2, False)

v = 1
v, b = test_and_subtract(v)
print(v) # 0
print(b) # True

v = 5
v, b = test_and_subtract(v)
print(v) # 3
print(b) # False

这里return (v - 1, True) 将两个结果放入一个元组中,b, v 将它们从该元组中删除。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2012-03-04
    • 2015-04-08
    • 2022-02-24
    • 2016-11-15
    相关资源
    最近更新 更多