【发布时间】:2012-11-16 06:02:06
【问题描述】:
似乎原子类型(int、string、...)是通过值传递的,而所有其他类型(对象、指向函数的指针、指向方法的指针,...)都是通过引用传递的。
检查变量是按值传递还是按引用传递的最佳方法是什么?
isinstance(input_, float) or isinstance(input_, basestring) or <...>
似乎很不雅。
我需要它的原因如下:我有一个包装wx.Button的类,如果args/kwargs是按值传递的类型,则不会考虑在其他对象中更新它们的值。所以一些检查将是有益的
class PalpyButton(wx.Button):
def __init__(self, parent, btnLabel, handler, successMsg = None, args = (), kwargs = {}):
super(PalpyButton, self).__init__(parent, -1, btnLabel)
self.handler = handler
self.successMsg = successMsg
parent.Bind(wx.EVT_BUTTON, lambda event: self.onClick(event, *args, **kwargs), self)
def onClick(self, event, *args, **kwargs):
try:
self.handler(*args, **kwargs)
if self.successMsg != None:
if hasattr(self.successMsg, '__call__'):
showInfoMessageBox(self.successMsg())
else:
showInfoMessageBox(self.successMsg)
except BaseException, detail:
showErrorMessageBox(detail)
【问题讨论】:
-
如果将相同的变量保留在 2 个“地方”,如果通过引用传递的变量在第一个“地方”发生更改,则它们不会在第二个“地方”更新,这将导致问题。通过引用传递的变量将被更新,并且可以正常工作。所以一些检查会是有益的......
-
你必须检查传递的对象的类型,看看它是否是一个可变容器。当然,这可能是您的代码一无所知的事情……,但如果是这样,那会告诉您。
-
@Martijn Pieters :我需要它用于 ain 接口类,这个类使用 wx。我认为提到 wx 会使我的问题过于狭窄。
标签: python types pass-by-reference pass-by-value