如何制作一个;“本地对象”;用Python?
我想知道为什么Python在下面的情况下表现不同 情况1。我更改了局部整数变量,但全局变量保持不变。好吧,没关系如何制作一个;“本地对象”;用Python?,python,object,global,local,Python,Object,Global,Local,我想知道为什么Python在下面的情况下表现不同 情况1。我更改了局部整数变量,但全局变量保持不变。好吧,没关系 N = 1 def Func1(x): x = 0 Func1(N) print(N) # prints 1 情况2。我更改局部对象的属性。。。看来我已经改变了全局对象 class C1: def __init__(self): self.A = 1 Obj1 = C1() def Func2(x): x.A = 0 #here i
N = 1
def Func1(x):
x = 0
Func1(N)
print(N) # prints 1
情况2。我更改局部对象的属性。。。看来我已经改变了全局对象
class C1:
def __init__(self):
self.A = 1
Obj1 = C1()
def Func2(x):
x.A = 0 #here is a confusing moment
Func2(Obj1)
print(Obj1.A) #prints 0
也许我对对象是否可以是局部的还没有完全理解?在这种情况下,如何编写类似于“本地对象”的代码?在python中,函数的参数是通过赋值传递的。[1] 在python中,赋值时不会复制对象。 因此,在第二个示例中,要创建对象的本地副本,您必须显式地复制它,例如使用
copy.deepcopy(x)
[2]
因此,您的第二个代码将成为:
import copy
class C1:
def __init__(self):
self.A = 1
Obj1 = C1()
def Func2(x):
x = copy.deepcopy(x) # Make a local copy of the object
x.A = 0 #No more confusion
Func2(Obj1)
print(Obj1.A) #prints 1
[1]
[2] 你把苹果和桔子比较(或者你想说什么就说什么)。在第一种情况下,您试图更改函数中全局变量的值。调用函数时,全局变量没有更改,因为Python通过赋值而不是引用传递变量。观察在您的第一个案例中,我们通过任务时发生的情况:
>>> N = 1
>>> def foo(x):
x = 0
return x
>>> foo(N) # this will not change N. we need to pass N by assingment
0
>>> N
1
>>> N = foo(N) # this will change N
>>> N
0
>>>
此行为记录在:
请记住,参数在Python中是通过赋值传递的。由于赋值只创建对对象的引用,所以调用者和被调用者中的参数名之间没有别名,因此没有引用调用本身
重点是我的
在第二种情况下,您没有更改全局变量的值<代码>Obj1是一个对象而不是变量您更改了Obj1
的属性,而不是Obj1
本身。查看尝试通过引用传递Obj1
时发生的情况:
>>> class CL:
def __init__(self):
self.A = 1
>>> Obj1 = CL()
>>> def foo(x):
# lets try chaning the actual value that Obj1 holds
x = None
>>> foo(Obj1) # did it change?
>>> Obj1
<__main__.CL object at 0x03B29B50>
>>> # Nope
>>类别CL:
定义初始化(自):
self.A=1
>>>Obj1=CL()
>>>def foo(x):
#让我们尝试更改Obj1保持的实际值
x=无
>>>foo(Obj1)#它变了吗?
>>>Obj1
>>>#没有
您没有更改全局对象。您更改了全局对象中的数据。如何创建类似全局对象的内容?