我写的程序通过对它们应用二进制操作来操纵整数(例如>>
,&
,|
)。许多操作都应用于函数内部,并且一旦函数返回,操作结果就会持续存在,我将返回已更改变量的副本。
类似的东西:
updated = applyOp(original, amnt)
def applyOp(original, amnt):
return original >> amnt
如果我不想返回整数的副本,而是希望函数中对original
所做的更改在函数外部保持不变,我想我可以创建一些包装类类。还有其他选择吗?也许那些特别促进逐位整数操作?
答案 0 :(得分:2)
在Python中,赋值给变量会更改变量绑定而不是特定内存位置的值。为了允许以您描述的方式进行修改,我相信您需要更改存储的数据而不是变量绑定。请看以下示例:
a = 1
b = a
a = 2
因为赋值更改了变量绑定,a
现在绑定到2
,但b
仍绑定到1
。你真的想要相反的行为,但(据我所知)这种行为在Python中不可用。
正如您所说,这将需要某种包装器。但是,为此目的的课程并非严格必要。实现此目的的最简单方法之一是将数据放入列表中。举个例子:
a = [1]
b = a
a[0] = 2
现在,a
和b
仍然包含相同的列表(因为没有重新分配),因此a[0] == b[0] == 2
。因此,一个有效的解决方案是始终将单项列表传递给函数,而不是直接传递值。
另一个答案可能是通过使它们成为同一个类的方法来共享函数之间的数据,这当然可以共享成员变量。但是,如果这种方法适合您,我无法从您有限的信息中得知。
以下是一个可能如何运作的示例:
class MyClass:
def __init__(self):
self._value = 0;
def do_something(self):
# Do something with self._value
self._helper_function()
# Continue using self._value
def _helper_function(self):
# No need to pass the value in. It is accessible at self._value
同样,这是否有效取决于你想要做什么。
答案 1 :(得分:0)
我猜你是来自像C这样的语言而且还没有熟悉Python的内部结构。
在python中,所有对象都通过引用传递。这意味着调用函数时不会进行复制。您可以通过查看对象的ID(内存位置)来测试它:
x = 0
print(id(x))
def f(y):
print(id(y))
f(x)
在这两种情况下,ID都是相同的,因此它们实际上是同一个对象而不是副本。
起初这看起来很荒谬,因为改变一个价值会怎么样?
x = 1
print(id(x))
x += 2
print(id(x))
如您所见,ID已更改。而不是x增加,我们得到了一个全新的对象!这是因为int
是不可变类型。
这意味着当对对象进行操作时,它返回一个新对象而不是修改它自己。相反的是可变类型,它可以自我修改。
python str
,float
,int
和tuple
类型是不可变的,而dict
,list
和{{1}类型是可变的。
但是一般来说,我建议你不要太在意实现细节和细微的性能差异,即使它很担心这样的事情。使代码运行良好并且首先可读,并在实际出现后处理可能的性能问题。