麻烦理解pass by reference
Posted
技术标签:
【中文标题】麻烦理解pass by reference【英文标题】:Trouble understanding 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);
我正在调用函数,引用为 serialDataLsb
和 serialDataMsb
。
现在我的困惑是,serialDataLsb
或 serialDataMsb
的值是多少,
是否得到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 的值
【参考方案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
将它们从该元组中删除。
【讨论】:
以上是关于麻烦理解pass by reference的主要内容,如果未能解决你的问题,请参考以下文章
php中reference啥意思?pass by reference是啥意思
Python中的passed by assignment与.NET中的passing by reference、passing by value
在Java里面谁能解释一下 pass by reference 还有pass by value?
C++ pass-by-non-const-reference 方法在 pass-by-const-reference 方法中