I wonder why Python behaves differently in the cases below?
Case 1. I change local integer variable but global variable remains the same. Well, that's OK.
N = 1
x = 0
print(N) # prints 1
self.A = 1
Obj1 = C1()
x.A = 0 #here is a confusing moment
print(Obj1.A) #prints 0
In python, arguments to functions are passed by assignment. 
And in python, objects are not copied on assignment.
So in your second example, to make what you call a local copy of the object, you will have to copy it explicitly, for instance using
So your second code would become:
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