如何制作一个;“本地对象”;用Python?

如何制作一个;“本地对象”;用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

我想知道为什么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 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
>>>#没有

您没有更改全局对象。您更改了全局对象中的数据。如何创建类似全局对象的内容?